Javascript 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","

我使用d3.nest()从CSV文件中创建层次对象

你能帮我理解为什么下面的代码不起作用吗。 我没有在循环中使用嵌套函数,如下所述

我有以下CSV文件,取自d3网站上的示例:

"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; })