给出以下JSON对象:
{"links":[
{"source": 0, "target": 3, "value": 5},
{"source": 0, "target": 2, "value": 3},
{"source": 0, "target": 2, "value": 3},
{"source": 0, "target": 1, "value": 2},
{"source": 0, "target": 6, "value": 1},
{"source": 0, "target": 6, "value": 1},
{"source": 0, "target": 6, "value": 1},
{"source": 1, "target": 3, "value": 2}
]}
我想对条目进行分组/合并/汇总,以便源 - 目标对的值总结,如下所示:
{"links":[
{"source": 0, "target": 3, "value": 5},
{"source": 0, "target": 2, "value": 6},
{"source": 0, "target": 1, "value": 2},
{"source": 0, "target": 6, "value": 3},
{"source": 1, "target": 3, "value": 2}
]}
有没有办法用D3来实现这个目标?我尝试过rollup(),但我不知道如何定义一个由多个键(源,目标)组成的键。
我认为我可以通过使用for循环和数组操作来处理这个question的答案,但我很高兴知道D3函数是否已经可以解决这个问题。
感谢您的帮助。
答案 0 :(得分:2)
处理此问题的一种方法是D3.nest()
:
var nest = d3.nest()
.key(function(d) { return "" + d.source + d.target; })
.rollup(function(leaves) {
var sum = d3.sum(leaves, function(g) { return g.value; });
return {
source: leaves[0].source,
target: leaves[0].target,
value: sum
};
});
然后,在链接数组上使用该嵌套:
data.links = d3.values(nest.map(data.links));
这里的工作示例:http://jsfiddle.net/qAHC2/830/