【问题标题】:D3: use nest function to turn flat data with parent key into a hierarchyD3:使用嵌套函数将带有父键的平面数据转换为层次结构
【发布时间】:2012-08-09 17:10:04
【问题描述】:

我确信有一种非常简单优雅的方法可以做到这一点,但我不太明白。我有一些如下所示的输入数据:

[
{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"}
      ]
   }
]

【问题讨论】:

    标签: javascript json nested operators d3.js


    【解决方案1】:

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

    也就是说,您可以编写自己的函数来生成一棵树。假设根节点是输入数组的第一个节点,可以创建一个从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];
    }
    

    如果您知道节点按顺序列出以便经理出现在他们的报告之前,您可以将代码简化为只迭代一次。

    【讨论】:

    • 非常感谢,这很有帮助。实际上,我从树的顶部开始通过(1)创建基于管理器(数组字典)的查找,(2)从已知的根开始,递归地将子项添加到每个报告中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-20
    • 2015-09-25
    • 1970-01-01
    • 1970-01-01
    • 2022-11-24
    • 2018-02-23
    • 2019-03-16
    相关资源
    最近更新 更多