我确信有一个非常简单的优雅方式来做到这一点,但我无法弄明白.我有一些看起来像这样的输入数据:
[
{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}
]
Run Code Online (Sandbox Code Playgroud)
如果可能,我想使用d3.js嵌套操作符来获取在层次结构布局中使用的结构.像这样:
[
{name: "Peter", children: [
{name:"Paul", children: [
{name:"John"},
{name:"Jane"}
]},
{name:"Mary"}
]
}
]
Run Code Online (Sandbox Code Playgroud) 我d3.nest()
用来将平面JSON文件转换为分层树。如果您事先知道数据中的级别,则此方法就很好了:d3.nest()
为传递给它的每个键函数创建一个嵌套级别。
但是,我想知道是否存在一种优雅的方式来动态传递键函数。这可能是一个基本问题,但是我的Javascript技能也是基本问题。
这是使用存储在数组中的键名的静态示例:
var levels = ['first', 'second', 'third']
var root = {
"key":"root",
"values":
d3.nest()
.key(function(d){ return d[levels[0]] })
.key(function(d){ return d[levels[1]] })
.key(function(d){ return d[levels[2]] })
.entries(data)
}
Run Code Online (Sandbox Code Playgroud)
现在,我的解决方案是一个if-else循环,该循环以伪动态方式创建不同的嵌套:
// build the nested tree pseudo-dynamically
if (levels.length === 1) {
var nest = d3.nest()
.key(function(d){return d[levels[0]]})
.entries(data);
} else if (levels.length === 2) {
var nest = d3.nest()
.key(function(d){return d[levels[0]]})
.key(function(d){return d[levels[1]]})
.entries(data);
} else if (levels.length === 3) {
var nest = d3.nest() …
Run Code Online (Sandbox Code Playgroud)