2012-10-29 15 views
6

Ho appena iniziato a lavorare con crossfilter e d3.js ... Sto cercando alcuni frammenti dato nel riferimento API ... ho i seguenti datiLavorare con filtri in Crossfilter

var payments = crossfilter([ 
    {date: "2011-11-14T16:17:54Z", quantity: 2, total: 190, tip: 100, type: "tab"}, 
    {date: "2011-11-14T16:20:19Z", quantity: 2, total: 190, tip: 100, type: "tab"}, 
    {date: "2011-11-14T16:28:54Z", quantity: 1, total: 300, tip: 200, type: "visa"}, 
    {date: "2011-11-14T16:30:43Z", quantity: 2, total: 90, tip: 0, type: "tab"}, 
    {date: "2011-11-14T16:48:46Z", quantity: 2, total: 90, tip: 0, type: "tab"}, 
    {date: "2011-11-14T16:53:41Z", quantity: 2, total: 90, tip: 0, type: "tab"}, 
    {date: "2011-11-14T16:54:06Z", quantity: 1, total: 100, tip: 0, type: "cash"}, 
    {date: "2011-11-14T16:58:03Z", quantity: 2, total: 90, tip: 0, type: "tab"}, 
    {date: "2011-11-14T17:07:21Z", quantity: 2, total: 90, tip: 0, type: "tab"}, 
    {date: "2011-11-14T17:22:59Z", quantity: 2, total: 90, tip: 0, type: "tab"}, 
    {date: "2011-11-14T17:25:45Z", quantity: 2, total: 200, tip: 0, type: "cash"}, 
    {date: "2011-11-14T17:29:52Z", quantity: 1, total: 200, tip: 100, type: "visa"} 
]); 

posso crea dimensione tramite tipo come

var paymentsByTotal = payments.dimension(function(d) { return d.type; }); 

La mia domanda è che come posso filtrare un array di stringhe. Ho provato:

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

Ma non ho ottenuto il risultato previsto!

Qualche suggerimento?

risposta

3

Con il codice sorgente nel ramo principale di Crossfilter.js, non è prevista l'unione di filtri, è necessario ottenere il codice da Jason Davies' union branch.

Quindi, dovresti essere in grado di eseguire paymentsByTotal.filter("cash","visa"); e ottenere l'output desiderato.

+0

Grazie per la risposta. – selvagsz

2

sembra che un filterFunction(function) è stato aggiunto dal momento che la risposta precedente, in modo che ora è possibile farlo con:

paymentsByTotal.filterFunction(function(d) { return d === "visa" || d === "cash" }); 
1

Se si dispone di una matrice di valori, e non si desidera specificare l'esplicito logica (es. d === "visa") per ciascun articolo, quindi è possibile estendere la soluzione filterFunction di sai per verificare se il valore è incluso nell'array. Farlo in questo modo semplifica le cose se la tua gamma di elementi da filtrare è grande o probabile che cambi.

var items = ['Visa', 'Cash']; 
paymentsByTotal.filterFunction(function(d) { return items.indexOf(d) > -1;});