我的数据看起来像这样
field1,field2,value1,value2
a,b,1,1
b,a,2,2
c,a,3,5
b,c,6,7
d,a,6,7
最终的目标是为value1+value2
和field1
的每个不同值获取field2
:{a:15(=1+2+5+7),b:9(=1+2+6),c:10(=3+7),d:6(=6)}
我没有很好的方法来重新排列数据,所以让我们假设数据必须保持这种状态。
基于this previous question(感谢@Gordon),我使用了:
cf.dimension(function(d) { return [d.field1,d.field2]; }, true);
但是对于如何为用例编写定制的reduce函数,我有些困惑。主要问题是:从reduceAdd
和reduceRemove
函数中,我如何知道当前正在“使用”哪个键?也就是说,在我的情况下,如何知道我应该将value1
还是value2
考虑在内?
(已标记dc.js和Reductio,因为它可能对那些库的用户有用)
答案 0 :(得分:1)
好的,所以我最后做了以下定义组的操作:
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
字段中存储的数据量过多时,效率低下,但是如果没有数百万个不同的值,则基本上可以忽略不计。
答案 1 :(得分:0)
在获取数据之后,然后再将其提供给交叉过滤器之前,总是有一种很好的方式来重新排列数据;)
实际上,一旦您处理非字符串字段(数字或日期),这几乎是强制性的
您可以在多个字段上进行reduceSum
dimensions.reduceSum(function(d) {return +d.value1 + +d.value2; });