如何过滤 dc/crossfilter 维度中的多个值?

How to filter multiple values in a dc/crossfilter dimension?

假设我有这个数据和维度:

var data = [
      {"fruit": "apple", "amount": "12"},
      {"fruit": "orange", "amount": "6"},
      {"fruit": "grape", "amount": "11"},
      {"fruit": "melon", "amount": "26"},
      {"fruit": "lemon", "amount": "15"}
    ]

var ndx = crossfilter(data);
var fruitDimension = ndx.dimension(function (d) {
                            return d.fruit;
                        });

...现在,我只想使用代码过滤 "apple"、"lemon" 和 "orange"。到目前为止,我正在尝试做类似的事情。

fruitDimension.filter(["apple","lemon","orange"])

...但并非全部有效。

参考资料来自:https://github.com/square/crossfilter/wiki/API-Reference

有人提示我可以做什么来过滤维度的不同元素(不遵循范围顺序)?

提前致谢, 罗杰

为此,Crossfilter 需要自定义过滤器功能。 dc.js 供应一个。

应用于 dc.js 图表

如果您使用的是 dc 图表,您应该通过图表的 filter 函数应用过滤器,该函数与交叉过滤器维度过滤器具有不同的语法和语义:

chart.filter([["apple","lemon","orange"]]);

注意额外的一组括号。很奇怪吧?我不知道它是如何进化成这样的。此外,dc 将 切换 每个值,因此如果要替换过滤器,请使用 replaceFilter 而不是 filter

这在 filterHandler function 中有记录,dc.js 将过滤器应用于交叉过滤器。

图表不知道交叉过滤器维度的直接变化:如果您使用图表的 .filter(),图表将更新视觉选择。

直接使用交叉过滤器

如果您想将多值过滤器直接应用于交叉过滤器维度,这里有一个函数可以为值数组生成过滤器函数:

function multivalue_filter(values) {
    return function(v) {
        return values.indexOf(v) !== -1;
    };
}
fruitDimension.filterFunction(multivalue_filter(["apple","lemon","orange"]));