D3:使用 nest 函数将带有父键的平面数据转换为层次结构
D3: use nest function to turn flat data with parent key into a hierarchy
我确信有一种非常简单优雅的方法可以做到这一点,但我不太清楚。 我有一些输入数据,如下所示:
[
{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 nest 运算符来获取要在层次结构布局中使用的结构。喜欢这个:
[
{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];
}
如果您知道节点的列出顺序是为了让管理器出现在其报告之前,则可以简化代码以仅迭代一次。
相关文章:
- 用程序搜索JQuery数据表中的文本
- 要求输入在数据列表中
- 正在将数据主题添加到所有项目
- 函数参数中的数据与指定变量之间的任何性能差异
- 在VanillaJS中模拟模型双向数据绑定
- CSS-如何定位内容数据标题
- 使用电话间隙在Android应用程序中显示SQL Lite的数据
- 无法在数据endVal中设置值=“”;{{ucount}}”;使用Angular JS的CountUp
- 序列化数据属性中对象的最可靠方法
- 如何将JSON数据导入我的ejs模板
- 不显示带有本地json文件数据的谷歌地图脚本
- 如何将json数据显示为html
- 画布数据到图像
- D3:使用 nest 函数将带有父键的平面数据转换为层次结构
- 如何使用非平面数据创建骨干集合
- 从平面json生成(多级)flare.json数据格式
- 将平面JSON对象转换为树形数据结构
- 无法使用平面UI选择框获取要显示的ID数据
- DOM操作和Javascript数据结构:平面的还是结构化的
- D3.js:通过 d3 加载平面一维数组.csv导致“类型错误:组数据未定义”/使用 D3.js 加载多个 CSV 文件