Follow up question to Flat array to tree 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.
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))
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.