[英]Tree structure to flat array Javascript
Follow up question to Flat array to tree Javascript跟进平面数组到树 Javascript 的问题
Looking for a solution of how to flatten a tree structure into an an array that can be used to insert into a sql db.寻找如何将树结构展平为可用于插入 sql 数据库的数组的解决方案。
Some other solutions I've found use recursion, but I was hoping to find an explanation of how a recursive solution would work.我发现的其他一些解决方案使用递归,但我希望找到有关递归解决方案如何工作的解释。
const tree = [
{
1: {
label: 'root',
children: [
{
2: {
label: 'ant',
children: [],
},
},
{
3: {
label: 'bear',
children: [
{
4: {
label: 'cat',
children: [],
},
},
{
5: {
label: 'dog',
children: [
{
6: {
label: 'elephant',
children: [],
},
},
],
},
},
],
},
},
{
7: {
label: 'frog',
children: [],
},
},
],
},
},
];
const expectedFlattenedTree = [
{ id: 1, label: 'root', parent_id: null },
{ id: 2, label: 'ant', parent_id: 1 },
{ id: 3, label: 'bear', parent_id: 1 },
{ id: 4, label: 'cat', parent_id: 3 },
{ id: 5, label: 'dog', parent_id: 3 },
{ id: 6, label: 'elephant', parent_id: 5 },
{ id: 7, label: 'frog', parent_id: 1 },
];
this a simple recusive function这是一个简单的递归函数
const tree = [ { 1: { label: 'root', children: [ { 2: { label: 'ant', children: [] } } , { 3: { label: 'bear', children: [ { 4: { label: 'cat', children: [] } } , { 5: { label: 'dog', children: [ { 6: { label: 'elephant', children: [] } } ] } } ] } } , { 7: { label: 'frog', children: [ ] } } ] } } ] const flatTree = [] function treeRun (xTree,parent_id) { xTree.forEach(el => { let [k,v] = Object.entries(el)[0] flatTree.push({id:k, label:v.label, parent_id }) if (v.children.length > 0) treeRun (v.children,k) }) } treeRun (tree,null) console.log( flatTree )
.as-console-wrapper {max-height: 100%!important;top:0 }
if you use browser to debug the script step by step,that will more intuitive to understand recursive.如果你使用浏览器一步一步地调试脚本,那会更直观地理解递归。
here I give a glimpse about recursive.在这里,我简要介绍一下递归。
const tree=[{1:{label:"root",children:[{2:{label:"ant",children:[]}},{3:{label:"bear",children:[{4:{label:"cat",children:[]}},{5:{label:"dog",children:[{6:{label:"elephant",children:[]}}]}}]}},{7:{label:"frog",children:[]}}]}}]; function flat(items,parent_id){ var flated = [] for (var item of items){ for (var id in item){ const obj = item[id] //construct flat item and append to list flated.push({"id":id,"label":obj['label'],"parent_id":parent_id}) if (obj['children'].length==0){ continue } //use children list go into sub function const sub_flated = flat(obj['children'],id) //concat array list using ES6 flated = [...flated,...sub_flated] } } return flated } console.log(flat(tree,null))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.