Crossfilter:当我想访问特定的数组值时,如何构建自定义reduce函数?

时间:2016-04-25 14:03:45

标签: crossfilter

我构建的crossfilter-setup与我能找到的大多数例子有点不同,即:

我的数据阵列d包含多个数据源,其中包括data1。

var cf = crossfilter(d3.range(0, d.data1.length));

然后我构建我的dims:

var dim = cf.dimension(function(i) { return d.data1[i].id; });

我构建了我的小组:

var group = dim.group().reduceSum(function(i) { return d.data1[i].total;});

这一切都运行正常,但是当我想创建自定义reduce函数时,额外的参数i给了我麻烦。

var reduceAddPerc = function(p,v) {
    p.sumOfSub += d.data1[i].var1;
    p.sumOfTotal += d.data1[i].total;
    p.finalVal = p.sumOfSub / p.sumOfTotal;
    return p;
};
var reduceRemovePerc = function(p,v) {
    p.sumOfSub -= d.data1[i].var1;
    p.sumOfTotal -= d.data1[i].total;
    p.finalVal = p.sumOfSub / p.sumOfTotal;
    return p;
};
var reduceInitialPerc = function() {
    return {sumOfSub:0, sumOfTotal:0, finalVal:0 };
}; 

然后用:

定义组
var group = dim.group().reduce(reduceAddPerc,reduceRemovePerc,reduceInitialPerc);

这显然不起作用,因为函数中现在不知道参数i。但我尝试添加参数(p,v,i),或者通过在(p,v)函数周围创建带参数i的附加函数来嵌套函数,并在(p)中创建附加函数(i) ,v)功能,但我不能让它工作。

有人提供任何帮助吗?

1 个答案:

答案 0 :(得分:0)

在自定义缩减功能中,101参数是当前正在减少的记录"。在这种情况下,它应该是您的计数器,所以只需在通常使用=IF(COUNTIF($A$1:$A2,A2)=1,((INT(MAX($B$1:$B1)/100)+1)*100)+1,MAX(INDEX(($A$1:$A1=A2)*$B$1:$B1,))+1) 的地方使用它。这不起作用吗?