我在与对象对应的键上有一个Crossfilterjs维度。
我对对象的一个属性进行分组,并使用reduceCount()查找该属性的值计数,但结果不是我所期望的。
我的代码:
<!DOCTYPE html>
<meta charset="utf-8">
<script src="//cdnjs.cloudflare.com/ajax/libs/crossfilter/1.3.9/crossfilter.min.js"></script>
<script>
var arr = [];
for (var i = 0; i < 100; i++) {
for (var j = 0; j < 100; j++) {
for (var k = 0; k < 100; k++) arr.push({a: i, e: { b: j, c: k}});
}
}
var cf = crossfilter(arr),
a = cf.dimension(function(d) { return d.a; }),
e = cf.dimension(function(d) { return d.e; });
var counts = e.group(function(d) { return d.b; })
.reduceCount()
.orderNatural()
.top(Infinity);
console.log(counts);
</script>
当我检查控制台时,我得到一个包含67个键/值对象的数组。
我期望得到一个包含100个键/值对象的数组,每个值对应一个b。
此外,有些计数并不是我所期望的。我希望所有的值都是一样的。然而,对于大多数键,我得到的值为100,对于少数键,我获得的值非常不同。键99的值为990100。
我在谷歌Chrome浏览器上得到了这些结果36.0.1985.143米
我以前没有在Crossfilterjs中使用过自定义分组函数,而且我似乎不太理解它的功能。
我在Crossfilterjs API上查找分组,但它并没有帮我理清思路。
提前感谢
Mea curpa
当我阅读这些文档时,我没有注意到这一点:
groupValue必须返回一个自然排序的值;此外,这个顺序必须与维度的值函数一致
我的分组值是一个字符串,它有一个自然的顺序,但我的维度是在一个没有的对象上创建的。订单之间的不一致一定是造成问题的原因。
然后我注意到文档中的另一个部分解决了在我的维度上排序的问题:
crossfilter.dimension()使用指定的值访问器构造新维度作用函数必须返回自然排序的值,即行为正确地关于JavaScript的<lt;=,>=和>运算符。这通常意味着基元:布尔值、数字或字符串;但是,您可以重写object.valueOf以提供给定对象的可比较值,例如Date。