Dc.js 正确填充数据所需的group.all()调用

Dc.js 正确填充数据所需的group.all()调用,dc.js,crossfilter,Dc.js,Crossfilter,因此,当交叉过滤器使用数组而不是文字数字时,我在处理基于变量创建组时遇到了一个奇怪的问题 我现在有一个日期的输出数组,然后是4个值,然后映射到一个复合图中。问题在于,这4个值可能会随页面输入的不同而波动。我的意思是,根据它接收到的信息,我可以有3个值,或者10个值,并且没有办法提前知道。它们被放入一个数组中,然后交给一个交叉滤波器。在测试时,我使用 dimension.group.reduceSum(function(d) { return d[0]; }); 其中0已更改为我需要的任何内容。

因此,当交叉过滤器使用数组而不是文字数字时,我在处理基于变量创建组时遇到了一个奇怪的问题

我现在有一个日期的输出数组,然后是4个值,然后映射到一个复合图中。问题在于,这4个值可能会随页面输入的不同而波动。我的意思是,根据它接收到的信息,我可以有3个值,或者10个值,并且没有办法提前知道。它们被放入一个数组中,然后交给一个交叉滤波器。在测试时,我使用

dimension.group.reduceSum(function(d) { return d[0]; });
其中0已更改为我需要的任何内容。但我已经完成了大部分测试,并开始将其调整到一个动态系统中,在这个系统中它可以改变,但总是至少有前两个。为此,我创建了一个整数来跟踪我的索引,然后在创建组后增加它。正在使用以下代码:

var range = crossfilter(results);
var dLen = 0;
var curIndex = 0;
var dateDimension = range.dimension(function(d) { dLen = d.length; return d[curIndex]; });
curIndex++;
var aGroup = dateDimension.group().reduceSum(function(d) { return d[curIndex]; });
curIndex++;
var bGroup = dateDimension.group().reduceSum(function(d) { return d[curIndex]; });
curIndex++;
var otherGroups = [];
for(var h = 0; h < dLen-3; h++) {
    otherGroups[h] = dateDimension.group().reduceSum(function(d) { return d[curIndex]; });
    curIndex++;
}
var charts = [];
for(var x = 0; x < dLen - 3; x++) {
    charts[x] = dc.barChart(dataGraph)
        .group(otherGroups[x], "Extra Group " + (x+1))
        .hidableStacks(true)
}
charts[charts.length] = dc.lineChart(dataGraph)
    .group(aGroup, "Group A")
    .hidableStacks(true)
charts[charts.length] = dc.lineChart(dataGraph)
    .group(aGroup, "Group B")
    .hidableStacks(true)
var范围=交叉过滤器(结果);
var-dLen=0;
var-curIndex=0;
var dateDimension=range.dimension(函数(d){dLen=d.length;返回d[curIndex];});
curIndex++;
var aGroup=dateDimension.group().reduceSum(函数(d){返回d[curIndex];});
curIndex++;
var bGroup=dateDimension.group().reduceSum(函数(d){返回d[curIndex];});
curIndex++;
var-otherGroups=[];
对于(var h=0;h
问题是: 图形被构建为空。我多次检查curIndex变量,结果总是正确的。我最终决定改为使用.all()方法检查实际组的结果数据

奇怪的是,在我使用.all()之后,现在数据工作了。如果没有.all()调用,图形将无法确定数据并完全不输出任何内容,但是如果在创建组后立即调用.all(),它将正确填充

每个组都需要调用.all(),否则只有调用的组才能工作。例如,当我第一次调试时,我只在aGroup上使用.all(),并且只在图形中填充aGroup。当我把它添加到bGroup时,aGroup和bGroup都被填充了。因此,在当前构建中,每个组在创建后都会直接调用.all()

技术上没有问题,但我真的不明白为什么需要这样做。我完全不知道这是什么原因,我想知道是否有任何洞察到它。当我使用文本时,没有问题,只有当我使用变量创建组时才会发生。后来我尝试获取输出,当我获取输出时,我收到了所有值的NaN。我真的不知道为什么.all()会将值更改为应该的值,尤其是当我在创建组后立即执行此操作时

下面是该图的屏幕截图。顶部是当所有对象在创建后都有一个.all()调用时,而底部是当额外的组(在for循环中定义的组)不再有.all()调用时。数据根本就不存在,我真的不知道为什么。任何想法都很好


看起来您可能遇到了经典的“从循环生成lambda”JavaScript问题

您正在创建一系列引用
curIndex
的函数,但除非您立即调用这些函数,否则它们将引用全局环境中的
curIndex
的同一实例。因此,如果您在初始化之后调用它们,它们可能都会尝试使用一个超过末尾的值

相反,您可以创建一个生成lambda的函数,如下所示:

function accessor(curIndex) {
    return function(d) { return d[curIndex]; };
}
然后每次调用
.reduceSum(访问器(curIndex))


这将导致每次调用
访问器
函数时都会复制curIndex的值(或者您可以将生成的每个函数视为具有自己的
curIndex
)的环境。

有趣。一般来说,这是非常有用的信息。这是我的一个工作项目,我将在接下来的几天内离开,但是当我在下一个工作时,我一定会尝试这个,并让你知道结果。只是想回复,让你知道它是有效的。非常感谢您提供的信息!很高兴我能帮忙。这在d3和dc中出现了很多,所以我。