我在与对象对应的键上有一个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。
我在Google Chrome浏览器36.0.1985.143 m中获得了这些结果。
我之前在Crossfilterjs中没有使用自定义分组功能,似乎我不能正确理解这些功能。
我查看了对Crossfilterjs API的分组,但它没有帮助我清理。
提前致谢
答案 0 :(得分:2)
Mea culpa
当我阅读文档时,我没有注意到这一点:
groupValue必须返回一个自然排序的值; 此外,此顺序必须与维度的值函数
一致
我的分组值是一个字符串,它具有自然顺序,但我的维度是在一个没有的对象上创建的。排序之间的不一致必然导致问题。
然后我注意到文档中的另一部分解决了我的维度排序问题:
crossfilter.dimension()使用指定的值访问器构造一个新维度 功能。该函数必须返回自然排序的值,即行为的值 正确的JavaScript&#;;&lt;,&lt; =,&gt; =和&gt;运营商。这通常意味着原语:布尔,数字或字符串;但是,您可以覆盖object.valueOf以提供给定对象的可比较值,例如Date。