【发布时间】:2014-01-03 22:15:41
【问题描述】:
我有一个如下所示的数组:
var arrays = [[1,2,3,4,5],
[1,2,6,4,5],
[1,3,6,4,5],
[1,2,3,6,5],
[1,7,5],
[1,7,3,5]]
我想使用d3.nest() 甚至只是标准的javascript 来将这些数据转换成一个嵌套的数据结构,我可以使用d3.partition。
具体来说,我想创建这种flare.json 数据格式。
我想用d3.nest() 创建的json 对象的级别对应于数组中的索引位置。请注意,1 在上面示例数据中的所有子数组中位于首位;因此,它位于树的根部。在数组的下一个位置有三个值,2、3 和 7,因此,根值 1 有 3 个子值。此时树看起来像这样:
1
/ | \
2 3 7
在子数组的第三个位置有四个值,3、5 和 6。这些孩子将按如下方式放入树中:
1
____|___
/ | \
2 3 7
/ \ / / \
3 6 6 3 5
如何使用d3.nest() 生成此数据结构?我上面展示的示例数据的完整数据结构应该如下所示:
{"label": 1,
"children": [
{"label": 2, "children": [
{"label": 3, "children": [
{"label": 4, "children": [
{"label": 5}
]},
{"label": 6, "children": [
{"label": 5}
]}
]},
{"label": 6, "children": [
{"label": 4, "children": [
{"label": 5}
]}
]},
{"label": 3, "children": [
{"label": 6, "children": [
{"label": 4, "children": [
{"label": 5}
]}
]}
]},
{"label": 7, "children": [
{"label": 3, "children": [
{"label": 5}
]},
{"label": 5}
]}
]}
]}
我正在尝试使用类似这样的方法转换上面的数组数据结构(非常错误):
var data = d3.nest()
.key(function(d, i) { return d.i; })
.rollup(function(d) { return d.length; })
我已经用了一周的时间来尝试了解如何从数组数组中生成这种分层数据结构。如果有人可以帮助我,我将不胜感激。
@meetamit 在 cmets 中的回答很好,但在我的情况下,我的树太深,无法重复将 .keys() 应用于数据,所以我无法手动编写这样的函数。
【问题讨论】:
-
首先,由于您想要多个嵌套级别,因此需要多次调用
d3.nest().key(...)。第一次调用key(function() {})时传入的函数将产生第一级;第二个函数将产生第二个级别,等等。查看this fiddle 中的控制台输出。它应该可以帮助您弄清楚如何将其转换为您想要的形式。 -
这非常有帮助。谢谢。
-
听起来你想要一个递归函数而不是
d3.nest。 -
我一直在找at this function,和我要找的差不多;但是,我似乎无法正确调整它以产生正确的树结构。
标签: d3.js