Javascript d3使用循环嵌套在多个关键点上
我使用d3.nest()从CSV文件中创建层次对象 你能帮我理解为什么下面的代码不起作用吗。 我没有在循环中使用嵌套函数,如下所述 我有以下CSV文件,取自d3网站上的示例:Javascript d3使用循环嵌套在多个关键点上,javascript,csv,svg,nested,d3.js,Javascript,Csv,Svg,Nested,D3.js,我使用d3.nest()从CSV文件中创建层次对象 你能帮我理解为什么下面的代码不起作用吗。 我没有在循环中使用嵌套函数,如下所述 我有以下CSV文件,取自d3网站上的示例: "type1","type2","type3","type4","type5","size" "flare","analytics","cluster","AgglomerativeCluster","","3938" "flare","analytics","cluster","CommunityStructure","
"type1","type2","type3","type4","type5","size"
"flare","analytics","cluster","AgglomerativeCluster","","3938"
"flare","analytics","cluster","CommunityStructure","","3812"
"flare","analytics","cluster","MergeEdge","","743"
"flare","analytics","graph","BetweennessCentrality","","3534"
"flare","analytics","graph","LinkDistance","","5731"
这种基本的嵌套工作:
data = data.entries(csv)
.key(function(d) {return d.type1; })
.key(function(d) {return d.type2; })
.key(function(d) {return d.type3; })
.entries(csv);
我想使用一个值数组来指定我的键,以便动态修改它们
这项工作:
var data = d3.nest();
var nesting = ["type1","type2","type3"];
data = data.key(function(d) {return d[nesting[0]]; });
data = data.key(function(d) {return d[nesting[1]]; });
data = data.key(function(d) {return d[nesting[2]]; });
data = data.entries(csv);
但它不适用于循环
var data = d3.nest();
for(var i=0;i<nesting.length;i++)
{
data = data.key(function(d) {return d[nesting[i]]; });
}
data = data.entries(csv);
var data=d3.nest();
对于(var i=0;i这不是.nest()
运算符的问题,而是JavaScript闭包的问题。任何时候出现这种模式:
for (var x=0; x < y; x++) {
something.attachCallback(function() {
// now do something with x
});
}
另一个选项是使用单独的函数进行回调定义。将迭代器变量传递给另一个函数将“修复”其值,因为回调现在引用的是创建者函数的参数,而不是原始的x
变量:
var data = d3.nest();
function addKey(index) {
data.key(function(d) { return d[nesting[index]]; })
}
for(var i=0;i<nesting.length;i++) {
addKey(i);
}
var data=d3.nest();
函数addKey(索引){
data.key(函数(d){返回d[nesting[index]];})
}
对于(var i=0;i游戏后期,但这是对@Ciwan上面评论2的回应。我没有足够的“声誉”来评论,所以我必须在这里回答:
d3.nest()
的结果正确:
{ key: something, values: [all,the,items,that,are,grouped,by,the,key] }
如果希望对这些项进行计数,可以使用d3.nest()的汇总,如下所示:
var data = d3.nest().rollup(function(leaves) { return leaves.length; })
是学习d3.nest()的标准场所。@nrabinowitz叶节点不应该是key:something,values:number
,而是在遵循代码时,我的叶节点(末尾的节点)有key:something,values:[]
!它有一个数组而不是数字值!知道如何将值
作为数字吗?如果我需要根据group by标识级别怎么办?假设我有两个group by作为键,那么我如何知道此级别是基于此值的?不知何故,我可以添加我用于group by的attr,使用attkey等键attr?@AmitRana-听起来这可能是一个单独的问题。@nrabinowitz
var data = d3.nest().rollup(function(leaves) { return leaves.length; })