如何从减少过滤空组?

Sco*_*ron 6 crossfilter

在我看来,Crossfilter永远不会从减少的结果中排除一个组,即使应用的过滤器已排除该组中的所有行.已过滤掉所有行的组只返回聚合值0(或任何reduceInitial返回值).

这样做的问题在于,它无法区分不包含行的组和包含行的组,而只是合法地聚合到值0.基本上,没有办法(我可以看到)区分null值和0聚合.

有没有人知道内置的Crossfilter技术来实现这一目标?我确实想出了一种方法来使用我自己的自定义reduceInitial/reduceAdd/reduceRemove方法来做到这一点,但它并不完全是直接的,在我看来,这是可能/应该更加本地化Crossfilter的过滤语义的行为.所以我想知道是否有规范的方法来实现这一目标.

如果事实证明没有内置方法可以做到这一点,我会发布我的技术作为答案.

dav*_*inn 6

实现此目的的一种简单方法是使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)