我说我有这些数据和维度:
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
的参考资料有人暗示我可以做些什么来过滤尺寸的不同元素(不遵循范围顺序)?
提前致谢, 罗杰
答案 0 :(得分:6)
Crossfilter需要自定义过滤功能。这就是dc.js在内部的作用。
如果您使用直流图表,则可以通过图表的filter
函数应用过滤器,但遗憾的是,该函数具有不同的语法和语义:
chart.filter([["apple","lemon","orange"]]);
请注意额外的括号。奇怪吧?我不知道它是如何通过这种方式进化的。请注意,dc也会切换每个值,因此如果您要替换过滤器,请使用replaceFilter
代替filter
。
这在filterHandler
function中有记录,这是dc.js实际应用过滤器到crossfilter的地方。请注意,这只是我下面第二个答案的一个稍微复杂的版本。
如果您希望直接在crossfilter中应用多值过滤器,可能最好使用函数来生成过滤函数,如下所示:
function multivalue_filter(values) {
return function(v) {
return values.indexOf(v) !== -1;
};
}
fruitDimension.filterFunction(multivalue_filter(["apple","lemon","orange"]));