在 2 个字段上的 crossfilter 中自定义减少函数

custom reduce functions in crossfilter on 2 fields

我的数据是这样的

field1,field2,value1,value2
a,b,1,1
b,a,2,2
c,a,3,5
b,c,6,7
d,a,6,7

最终目标是为 field1field2 的每个不同值获得 value1+value2{a:15(=1+2+5+7),b:9(=1+2+6),c:10(=3+7),d:6(=6)}

我没有重新排列数据的好方法,所以让我们假设数据必须保持这样。

基于(感谢@Gordon),我使用映射:

cf.dimension(function(d) { return [d.field1,d.field2]; }, true);

但是我对如何为我的用例编写自定义 reduce 函数感到有些困惑。主要问题是:在 reduceAddreduceRemove 函数中,我如何知道当前 "worked on" 是哪个键?即在我的情况下,我怎么知道我是否应该在我的总和中考虑 value1value2

(已标记 dc.js 和 reductio,因为它可能对这些库的用户有用)

你总是有一个很好的方法来 re-arrange 数据,在你获取它之后并且在你将它提供给 crossfilter 之前;)

事实上,一旦您处理非字符串字段(数字或日期),它几乎是强制性的

您可以对多个字段执行 reduceSum

dimensions.reduceSum(function(d) {return +d.value1 + +d.value2; });

好的,所以我最后做了以下定义组的事情:

reduceAdd: (p, v) => {
    if (!p.hasOwnProperty(v.field1)) {
        p[v.field1] = 0;
    }
    if (!p.hasOwnProperty(v.field2)) {
        p[v.field2] = 0;
    }
    p[v.field1] += +v.value1;
    p[v.field2] += +v.value2;
    return p;
}
reduceRemove: (p, v) => {
    p[v.field1] -= +v.value1;
    p[v.field2] -= +v.value2;
    return p;
}
reduceInitial: () => {
    return {}
}

当您在图表中使用组时,只需将 valueAccessor 更改为 (d) => d.value[d.key] 而不是通常的 (d) => d.value

由于在 value 字段中存储的数据多于所需的数据,因此效率低下,但如果您没有数百万个不同的值,则基本上可以忽略不计。