javascript – D3:使用嵌套函数将父键的平面数据转换为层次结构

前端之家收集整理的这篇文章主要介绍了javascript – D3:使用嵌套函数将父键的平面数据转换为层次结构前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我确信有一个非常简单的优雅方式来做到这一点,但我无法弄明白.我有一些看起来像这样的输入数据:
  1. [
  2. {id: 1,name: "Peter"},{id: 2,name: "Paul",manager: 1},{id: 3,name: "Mary",{id: 4,name: "John",manager: 2},{id: 5,name: "Jane",manager: 2}
  3. ]

如果可能,我想使用d3.js嵌套操作符来获取在层次结构布局中使用的结构.像这样:

  1. [
  2. {name: "Peter",children: [
  3. {name:"Paul",children: [
  4. {name:"John"},{name:"Jane"}
  5. ]},{name:"Mary"}
  6. ]
  7. }
  8. ]

解决方法

此处不能使用嵌套运算符,因为嵌套会生成固定的层次结构:输出层次结构中的级别数与指定的键函数数相同.

也就是说,您可以编写自己的函数生成树.假设根节点是输入数组中的第一个节点,您可以创建从id到node的映射,然后懒惰地构造树.

  1. function tree(nodes) {
  2. var nodeById = {};
  3.  
  4. // Index the nodes by id,in case they come out of order.
  5. nodes.forEach(function(d) {
  6. nodeById[d.id] = d;
  7. });
  8.  
  9. // Lazily compute children.
  10. nodes.forEach(function(d) {
  11. if ("manager" in d) {
  12. var manager = nodeById[d.manager];
  13. if (manager.children) manager.children.push(d);
  14. else manager.children = [d];
  15. }
  16. });
  17.  
  18. return nodes[0];
  19. }

如果您知道节点按顺序列出,以便管理器出现在报表之前,则可以简化代码以仅迭代一次.

猜你在找的JavaScript相关文章