在我看来,Crossfilter永远不会从减少的结果中排除一个组,即使应用的过滤器已排除该组中的所有行.已过滤掉所有行的组只返回聚合值0(或任何reduceInitial返回值).
这样做的问题在于,它无法区分不包含行的组和包含行的组,而只是合法地聚合到值0.基本上,没有办法(我可以看到)区分null值和0聚合.
有没有人知道内置的Crossfilter技术来实现这一目标?我确实想出了一种方法来使用我自己的自定义reduceInitial/reduceAdd/reduceRemove方法来做到这一点,但它并不完全是直接的,在我看来,这是可能/应该更加本地化Crossfilter的过滤语义的行为.所以我想知道是否有规范的方法来实现这一目标.
如果事实证明没有内置方法可以做到这一点,我会发布我的技术作为答案.
实现此目的的一种简单方法是使count和total都为reduce属性:
var dimGroup = dim.group().reduce(reduceAdd, reduceRemove, reduceInitial);
function reduceAdd(p, v) {
++p.count;
p.total += v.value;
return p;
}
function reduceRemove(p, v) {
--p.count;
p.total -= v.value;
return p;
}
function reduceInitial() {
return {count: 0, total: 0};
}
Run Code Online (Sandbox Code Playgroud)
空组将没有计数,因此只检索非空组很容易:
dimGroup.top(Infinity).filter(function(d) { return d.value.count > 0; });
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2096 次 |
| 最近记录: |