简体   繁体   English

树结构到平面数组Javascript

[英]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.在这里,我简要介绍一下递归。

  • we will call flat function and loop at the top level我们将在顶层调用平面函数和循环
  • after construct current obj or node,this is still normal operation构造当前的obj或节点后,这仍然是正常的操作
  • we call flat in flat with children node,then we goes into sub level,at this time is like space jump magic.we go into another flat function with children,but the current flat function not finished yet.我们在flat with children节点中调用flat,然后进入sub level,此时就像空间跳跃魔术。我们进入另一个带有children的flat函数,但是当前flat函数还没有完成。
  • after sub level flat (or sub level's sub level) finished,the top level flat continue run,and concat the created list子级平面(或子级的子级)完成后,顶层平面继续运行,并连接创建的列表

 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM