从平面数组数据制作树

时间:2018-11-15 17:37:14

标签: javascript

假设我们的数组是这样的

0: (1) [{…}]
1: (3) [{…}, {…}, {…}]
2: [{…}]
3: (2) [{…}, {…}]
4: (2) [{…}, {…}]
5: (3) [{…}, {…}, {…}]
6: (2) [{…}, {…}]
7: (2) [{…}, {…}]
8: (2) [{…}, {…}]
9: (2) [{…}, {…}]
10: (2) [{…}, {…}]
11: (2) [{…}, {…}]
12: (3) [{…}, {…}, {…}]
13: (2) [{…}, {…}]
14: (2) [{…}, {…}]
15: (3) [{…}, {…}, {…}]
16: [{…}]

这里是完整文件https://pastebin.com/GSePG9qN。它很大,所以我将其截短。

所以从上面的数组中我们可以看到 0:有1个孩子,这意味着1是0的孩子。 1:有3个孩子,这意味着2,3和4是其孩子。

如何有效地合并它们,这样我就可以做到

{
  data: 0 data
  children: [
   {
     data: 1:data,
     children: {
       {
         data: 2:data,
         children: similar..
       },
       {
         data: 3:data,
         children: similar
       }
     }
    }
  ]
}

我尝试遍历for循环,但是将子代添加到新变量的部分是如此混乱。

谢谢

1 个答案:

答案 0 :(得分:1)

通过使用精美的嵌套数组,我将子级索引添加到了每个对象中。

通过在第一个索引处进行迭代来构建树,并使用嵌套项的索引从数组中获取所有子项。

const buildTree = o => Object.assign({}, o, { children: (data[o.children] || []).map(buildTree) })

var data = [
        [{ id: 0 }],
        [{ id: 1 }, { id: 2 }, { id: 3 }],
        [{ id: 4 }],
        [{ id: 5 }, { id: 6 }],
        [{ id: 7 }, { id: 8 }],
        [{ id: 9 }, { id: 10 }, { id: 11 }],
        [{ id: 12 }, { id: 13 }],
        [{ id: 14 }, { id: 15 }],
        [{ id: 16 }, { id: 17 }],
        [{ id: 18 }, { id: 19 }],
        [{ id: 20 }, { id: 21 }],
        [{ id: 22 }, { id: 23 }],
        [{ id: 24 }, { id: 25 }, { id: 26 }],
        [{ id: 27 }, { id: 28 }],
        [{ id: 29 }, { id: 30 }],
        [{ id: 31 }, { id: 32 }, { id: 33 }],
        [{ id: 34 }]
    ],
    result;

data.forEach((i => a => a.forEach(o => o.children = ++i))(0));
result = data[0].map(buildTree);

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }