7
votes

Does anyone have an approach to filtering a crossfilter object dimension on multiple values? Something like

.filterExact(["cash","visa"])

or

.filter(["cash","visa"])

...but not the range form of it...

or

.filterAll(["cash","visa"])

...but without the clearing part.

or an equivalent workaround/approach not using

.filterRange(["cash","visa"])

??

Or am I missing something in the API?

Thanks!

Larry

3

3 Answers

13
votes

I was facing a similar problem. The way I solved it was that I wrote a filter function that would check whether the dimension lies in a particular array or not.

// Array of things you want to filter
var f = ["cash", "visa"];
// Assuming "dim" is our dimension
dim.filter(function(d){
  return f.indexOf(d) > -1;
});

This will check if the value lies in that array and filter accordingly.

Hope this helps.

2
votes

The following pull request looks like it would address your needs, but it has not yet been merged in.

Multiple arguments to filter result in union of filter operations

Once merged you would be able to do something like the following.

data.total.filter("cash", "visa");

Which would result in the union of all filter criteria.

1
votes

There doesn't seem to be anything in the API, but if you want to avoid filterRange, you could to it with two basic filters and concating the results:

var paymentsByType = payments.dimension(function(d) { return d.type; }),
cashAndVisaPayments = Array.prototype.concat(paymentsByType.filter('cash').top(Infinity),paymentsByType.filter('visa').top(Infinity))