在 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
最终目标是为 field1
和 field2
的每个不同值获得 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 函数感到有些困惑。主要问题是:在 reduceAdd
和 reduceRemove
函数中,我如何知道当前 "worked on" 是哪个键?即在我的情况下,我怎么知道我是否应该在我的总和中考虑 value1
或 value2
?
(已标记 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
字段中存储的数据多于所需的数据,因此效率低下,但如果您没有数百万个不同的值,则基本上可以忽略不计。
我的数据是这样的
field1,field2,value1,value2
a,b,1,1
b,a,2,2
c,a,3,5
b,c,6,7
d,a,6,7
最终目标是为 field1
和 field2
的每个不同值获得 value1+value2
:{a:15(=1+2+5+7),b:9(=1+2+6),c:10(=3+7),d:6(=6)}
我没有重新排列数据的好方法,所以让我们假设数据必须保持这样。
基于
cf.dimension(function(d) { return [d.field1,d.field2]; }, true);
但是我对如何为我的用例编写自定义 reduce 函数感到有些困惑。主要问题是:在 reduceAdd
和 reduceRemove
函数中,我如何知道当前 "worked on" 是哪个键?即在我的情况下,我怎么知道我是否应该在我的总和中考虑 value1
或 value2
?
(已标记 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
字段中存储的数据多于所需的数据,因此效率低下,但如果您没有数百万个不同的值,则基本上可以忽略不计。