在Crossfilterjs中使用group时出现意外行为



我在与对象对应的键上有一个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。

相关内容

  • 没有找到相关文章

最新更新