2013-03-21 12 views

Antwort

2

Ich bin nicht vertraut mit Crossfilter, nur damit begonnen, damit zu spielen. Es gibt möglicherweise einen besseren Weg, aber dies bietet eine Möglichkeit, die Anzahl der für die Gruppierung verwendeten Dimension (en) zu berechnen (ich bin nicht 100% klar, dass d.count auf die Anzahl der Dimension verweist, die für die Gruppierung verwendet wird) eine andere Gruppierung, falls erforderlich).

Beispiel aus dem Code abgeleitet unter: https://github.com/square/crossfilter/wiki/API-Reference

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"} 
]); 

var paymentsByType = payments.dimension(function(d) { return d.type; }), 
     paymentVolumeByType = paymentsByType.group(), 
     counts = paymentVolumeByType.reduceCount().all(), 
     countByType = {}; 

// what is returned by all is a pseudo-array. An object that behaves like an array. 
// Trick to make it a proper array 
Array.prototype.slice.call(counts).forEach(function(d) { countByType[d.key] = d.value; }) 
var paymentVolumeByType = paymentVolumeByType.reduceSum(function(d, i) { 
    console.log(d.total, d.type, countByType[d.type]) 
    return d.total/countByType[d.type]; 
}); 
// accessing parentVolumeByType to cause the reduceSum function to be called 
var topTypes = paymentVolumeByType.top(1); 
+0

Der Kommentar unterhalb die beabsichtigte Art und Weise, dies zu erreichen. –

11

Ich denke, ein besserer (und die beabsichtigte) Weg, dies zu tun ist, indem Sie Ihre eigenen reduzieren Funktionen definieren (Hinzufügen, Entfernen, initial). Sie können dann Ihre laufende Summe, Anzahl usw. innerhalb der Reduzierungsfunktionen speichern und sie entsprechend anpassen, wenn die Filter & Daten aus der Gruppe entfernen.

Ein Beispiel hierfür mit Mitteln tun und mit min & max sind in dieser ähnlichen Frage gegeben: Using Crossfilter, is it possible to track max/min when grouping?