我敢肯定有一种非常简单而优雅的方法可以做到这一点,但是我不太清楚。我有一些看起来像这样的输入数据:
[ {id: 1, name: "Peter"}, {id: 2, name: "Paul", manager: 1}, {id: 3, name: "Mary", manager: 1}, {id: 4, name: "John", manager: 2}, {id: 5, name: "Jane", manager: 2} ]
如果可能,我想使用d3.js嵌套运算符来获取要在层次结构布局中使用的结构。像这样:
[ {name: "Peter", children: [ {name:"Paul", children: [ {name:"John"}, {name:"Jane"} ]}, {name:"Mary"} ] } ]
您不能在此处使用nest运算符,因为嵌套会产生固定的层次结构:输出层次结构中的级别数与您指定的键函数的数量相同。
也就是说,您可以编写自己的函数来生成树。假设根节点是输入数组中的第一个节点,则可以创建从id到节点的映射,然后懒惰地构造树。
function tree(nodes) { var nodeById = {}; // Index the nodes by id, in case they come out of order. nodes.forEach(function(d) { nodeById[d.id] = d; }); // Lazily compute children. nodes.forEach(function(d) { if ("manager" in d) { var manager = nodeById[d.manager]; if (manager.children) manager.children.push(d); else manager.children = [d]; } }); return nodes[0]; }
如果您知道节点是按顺序列出的,以使管理人员出现在报告之前,则可以简化代码以仅重复一次。