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

試著忘記壹切 提交于 2019-12-11 01:50:00

问题


Let me say that I have this data and 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;
                        });

...and now, I want to filter just "apple","lemon" and "orange" just by using code. By now, I am trying to do something like.

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

...but it does not work it all.

  • I know that the function # dimension.filterExact(value) works for one value.

    • If I apply # dimension.filter(value) passing a vector as parameter, it deals with it as # dimension.filterRange(range)

    • I could not find which filter works for different values.

references from: https://github.com/square/crossfilter/wiki/API-Reference

Someone has a hint about what I could be doing in order to filter different elements (that do not follow a range order) of a dimension?

Thanks in advance, Roger


回答1:


Crossfilter requires a custom filter function for this. dc.js supplies one.

Applying to a dc.js chart

If you're using a dc chart you should apply the filter via the chart's filter function, which has different syntax and semantics from the crossfilter dimension filter:

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

Note the extra set of brackets. Weird right? I do not know how it evolved this way. Also, dc will toggle each value, so if you want to replace the filter, use replaceFilter instead of filter.

This is documented in the filterHandler function, which is where dc.js applies filters to crossfilter.

The chart doesn't know about changes directly to the crossfilter dimension: if you use the chart's .filter() then the chart will update the visual selection.

Directly with crossfilter

If instead you want to apply a multivalue filter directly to a crossfilter dimension, here is a function that generates a filter function for an array of values:

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


来源:https://stackoverflow.com/questions/38920359/how-to-filter-multiple-values-in-a-dc-crossfilter-dimension

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!