在Crossfilterjs中使用组的意外行为

时间:2014-08-29 11:14:04

标签: javascript mapreduce crossfilter

我在与对象对应的键上有一个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的分组,但它没有帮助我清理。

提前致谢

1 个答案:

答案 0 :(得分:2)

Mea culpa

当我阅读文档时,我没有注意到这一点:

  

groupValue必须返回一个自然排序的值;   此外,此顺序必须与维度的值函数

一致

我的分组值是一个字符串,它具有自然顺序,但我的维度是在一个没有的对象上创建的。排序之间的不一致必然导致问题。

然后我注意到文档中的另一部分解决了我的维度排序问题:

  

crossfilter.dimension()使用指定的值访问器构造一个新维度   功能。该函数必须返回自然排序的值,即行为的值   正确的JavaScript&#;;&lt;,&lt; =,&gt; =和&gt;运营商。这通常意味着原语:布尔,数字或字符串;但是,您可以覆盖object.valueOf以提供给定对象的可比较值,例如Date。