2012-05-15 7 views
16

Considero que la explicación de la API de la biblioteca de filtro cruzado está escrita para alguien por encima de mi perfil, pero también sé que dominarlo resolverá mi problema.Uso de filtro cruzado para devolver resultados de forma dinámica en JavaScript

Para hacerlo simple, haré referencia al API Page's de datos de ejemplo para esta pregunta.

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

soy capaz de devolver registros que coinciden con una clave específica (cantidad, total, etc.), pero no entienden cómo devolver resultados que coinciden con una combinación de pares clave/valor. Por ejemplo, ¿cómo devolvería el conjunto de resultados que coinciden con una cantidad mayor de 1, un total igual a 90, una propina igual a 0 y un tipo de pestaña? Aquí es donde estoy completamente perdido.

Como siempre, cualquier ayuda sería apreciada.

Respuesta

26

Puede crear una dimensión para cada atributo y luego llamar al método de filtro de cada dimensión con los criterios de filtro correspondientes que indicó, como ese.

var payments_by_quantity = payments.dimension(function(d){return d.quantity}), 
    payments_by_total = payments.dimension(function(d){return d.total}), 
    payments_by_tip = payments.dimension(function(d){return d.tip}), 
    payments_by_type = payments.dimension(function(d){return d.type}); 

payments_by_quantity.filter([1, Infinity]); 
payments_by_total.filter(90); 
payments_by_tip.filter(0); 
payments_by_type.filter("tab"); 

payments_by_type.top(Infinity) 

Los efectos son acumulativos, por lo que la última línea es en realidad el resultado de todos los valores que respetan todos los filtros de todas las dimensiones.

2

Encontré la respuesta anterior precisa pero inexacta para mí como principiante, es decir, no obtuve ni resultados inesperados (sin irrespeto slo-jo, pero estoy escribiendo desde una perspectiva de principiante ya que soy una nube de filtro cruzado). Los inconvenientes son la necesidad de borrar los filtros antes de llamar a algunos filtros (deberá ampliar el conjunto de datos con más variedad, por ejemplo, diferentes sugerencias, totales, etc. para ver lo que quiero decir). La salida a la consola me ayuda.

Esto es lo que ayuda a mi entendimiento:

var data = [ 
    {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: 222, total: 990, 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: 5, 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: 990, 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"} 
]; 



<script type="text/javascript"> 

// questions: For instance, how would I return the result set that matched results with a quantity more than 1, a total equal 90, a tip equal 0 and a type of tab? 
// create dimensions for each attribute 
var payments_by_quantity = payments.dimension(function(d){return d.quantity}); 
    payments_by_total = payments.dimension(function(d){return d.total}), 
    payments_by_tip = payments.dimension(function(d){return d.tip}), 
    payments_by_type = payments.dimension(function(d){return d.type}); 

//need top(Infinity) to print out contents of filtered items 
var morethan1 = payments_by_quantity.filter([1, Infinity]).top(Infinity); 
console.log("morethan1",morethan1); 

var tot_eq_90 = payments_by_total.filter(90).top(Infinity); 
console.log("tot_eq_90",tot_eq_90); 

// clear filters. If not, the result below will still be filtered by totals = 90 
payments_by_total.filterAll(); 

console.log("top1= biggest paymt qty:", payments_by_quantity.top(1)); 
payments_by_total.filterAll(); 
console.log("top2= biggest paymt qty:", payments_by_quantity.top(2)); 
payments_by_total.filterAll(); 

console.log("bottom paymt tip:", payments_by_tip.bottom(1)); 

var tip_eq_0 = payments_by_tip.filter(0).top(Infinity); 
console.log("tip_eq_0",tip_eq_0); 
payments_by_total.filterAll(); 

var typetab = payments_by_type.filter("tab").top(Infinity); 
console.log("typetab",typetab); 
payments_by_total.filterAll(); 

var typetab_i = payments_by_type.top(Infinity); 
console.log("typetab+i",typetab_i); 
Cuestiones relacionadas