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

时间:2016-08-12 14:26:00

标签: javascript dc.js crossfilter

我说我有这些数据和维度:

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"])

......但它并不能正常运作。

  • 我知道函数# dimension.filterExact(value)适用于一个值。

    • 如果我将# dimension.filter(value)传递给参数作为参数,则会将其作为#dimension.filterRange(范围)

    • 处理
    • 我找不到哪个过滤器适用于不同的值。

来自https://github.com/square/crossfilter/wiki/API-Reference

的参考资料

有人暗示我可以做些什么来过滤尺寸的不同元素(不遵循范围顺序)?

提前致谢, 罗杰

1 个答案:

答案 0 :(得分:6)

Crossfilter需要自定义过滤功能。这就是dc.js在内部的作用。

应用于dc.js图表​​

如果您使用直流图表,则可以通过图表的filter函数应用过滤器,但遗憾的是,该函数具有不同的语法和语义:

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

请注意额外的括号。奇怪吧?我不知道它是如何通过这种方式进化的。请注意,dc也会切换每个值,因此如果您要替换过滤器,请使用replaceFilter代替filter

这在filterHandler function中有记录,这是dc.js实际应用过滤器到crossfilter的地方。请注意,这只是我下面第二个答案的一个稍微复杂的版本。

直接使用crossfilter

如果您希望直接在crossfilter中应用多值过滤器,可能最好使用函数来生成过滤函数,如下所示:

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