2012-10-29 6 views
6

Ich habe gerade angefangen mit crossfilter und d3.js arbeiten ... Ich bin in der API-Referenz gegeben ... ich folgende DatenArbeiten mit Filtern 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"} 
]); 

Ich kann Habe einige Schnipsel versucht schaffen Dimension über Typ als

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

Meine Frage ist, wie ich ein Array von Strings filtern. Ich habe versucht:

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

Aber ich habe nicht das erwartete Ergebnis erhalten!

Irgendwelche Vorschläge?

Antwort

3

Mit dem Quellcode im Master-Zweig von Crossfilter.js gibt es keine Vorkehrungen für die Vereinigung von Filtern, Sie müssen den Code von Jason Davies' union branch bekommen.

Dann sollten Sie paymentsByTotal.filter("cash","visa"); tun können und die gewünschte Ausgabe erhalten.

+0

Danke für die Antwort. – selvagsz

2

scheint, dass ein filterFunction(function) seit der vorherigen Reaktion hinzugefügt wurde, so dass Sie jetzt diese mit tun können:

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

Wenn Sie ein Array von Werten, und Sie wollen nicht auf die explizit angeben Logik (dh d === "visa") für jedes Element, dann können Sie Sais filterFunction Lösung zu überprüfen, ob der Wert in Ihrem Array enthalten ist. Wenn Sie dies auf diese Weise tun, werden die Dinge einfacher, wenn Ihr Array von zu filternden Elementen groß ist oder sich wahrscheinlich ändert.

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