从带有子字段的平面列表构造层次树并保留子顺序?

时间:2018-09-29 11:54:15

标签: javascript arrays tree hierarchy

之前herehere曾问过类似的问题,还有npm-packages -我无法找到JavaScript代码段或npm软件包,可以保留孩子的顺序

考虑以下数据结构:

var nodes = [{id: 'a', parent: null, children: ['c', 'b']},
             {id: 'b', parent: 'a', children: []},
             {id: 'c', parent: 'a', children: []}]

我想要一个这样的嵌套对象:

var tree = {id: 'a', parent: null, children: [
    {id: 'c', parent: 'a', children: []},
    {id: 'b', parent: 'a', children: []}
]}

重要的事实是,由于 a 的子级顺序是 c,b ,因此嵌套的结果 children 数组结构将保留顺序。

1 个答案:

答案 0 :(得分:2)

如果您先构建地图,这非常简单:

 const nodeById = new Map(nodes.map(el => [el.id, el]));

然后,您可以轻松构建树:

 let root;

 for(const node of nodes) {
   node.children = node.children.map(id => nodeById.get(id));
   if(!node.parent) root = node;
 }