Crossfilter-无法从其他组(不是从关联组)中获取已过滤的记录

时间:2018-11-22 06:29:39

标签: javascript crossfilter

我正在使用参考文献http://square.github.io/crossfilter/中的“飞机”数据集

date,delay,distance,origin,destination
01010001,14,405,MCI,MDW
01010530,-11,370,LAX,PHX
...

  // Create the crossfilter for the relevant dimensions and groups.
  var flight = crossfilter(flights),
      all = flight.groupAll(),
      date = flight.dimension(function(d) { return d.date; }),
      dates = date.group(d3.time.day),
      hour = flight.dimension(function(d) { return d.date.getHours() + d.date.getMinutes() / 60; }),
      hours = hour.group(Math.floor),
      delay = flight.dimension(function(d) { return Math.max(-60, Math.min(149, d.delay)); }),
      delays = delay.group(function(d) { return Math.floor(d / 10) * 10; }),
      distance = flight.dimension(function(d) { return Math.min(1999, d.distance); }),
      distances = distance.group(function(d) { return Math.floor(d / 50) * 50; });

document之后,Crossfilter出现了“组未按其自身维度观察过滤器” =>我们可以从当前未过滤其维度的组中获取过滤记录,是吗? / p>

我已经做了一些测试,但这是不正确的:

  console.dir(date.group().all()); // 50895 records
  console.dir(distance.group().all()); // 297 records

  date.filter([new Date(2001, 1, 1), new Date(2001, 2, 1)]);

  console.dir(date.group().all()); // 50895 records => this number still the same because we are filtering on its dimension
  console.dir(distance.group().all()); // 297 records => but this number still the same too. I don't know why
  1. 您能否为我解释为什么“ distance.group()。all()”的数量仍然与执行过滤器之前的数量相同?我在这里想念东西吗?

  2. 如果我们真的不能通过这种方式从“距离维”中获取“过滤的记录”,我该如何实现?

谢谢。

1 个答案:

答案 0 :(得分:1)

是的,这是预期的行为。

Crossfilter将通过应用尺寸键和组键功能在组中为其找到的每个值创建一个“ bin”。然后,当应用过滤器时,它将应用reduce-remove函数,该函数默认会减去已删除的行数。

结果是空箱仍然存在,但它们的值为0。

编辑:这里是the Crossfilter Gotchas entry with further explanation

如果要删除零,可以使用“假组”来完成。

function remove_empty_bins(source_group) {
    return {
        all:function () {
            return source_group.all().filter(function(d) {
                //return Math.abs(d.value) > 0.00001; // if using floating-point numbers
                return d.value !== 0; // if integers only
            });
        }
    };
}

https://github.com/dc-js/dc.js/wiki/FAQ#remove-empty-bins

此函数通过调用.all()将组包装在实现source_group.all()的对象中,然后过滤结果。因此,如果您使用的是dc.js,则可以将此假组提供给图​​表,如下所示:

chart.group(remove_empty_bins(yourGroup));