Uso de filtro cruzado para devolver dinĂ¡micamente los resultados en JavaScript
crossfilter d3 (2)
Siento que la explicación de la API de la biblioteca de filtro cruzado está escrita para alguien que está por encima de mi conjunto de habilidades, pero también sé que dominarlo resolverá mi problema.
Para hacerlo simple, haré referencia a los datos de ejemplo de la página de la API 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"}
]);
Puedo devolver registros que coincidan con una clave específica (cantidad, total, etc.), pero no entiendo cómo devolver resultados que coincidan con una combinación de pares clave / valor. Por ejemplo, ¿cómo devolvería el conjunto de resultados que coincidía con una cantidad mayor que 1, un total igual a 90, una punta igual a 0 y un tipo de pestaña? Aquí es donde estoy completamente perdido.
Me pareció que la respuesta anterior era precisa pero inexacta para mí como principiante, es decir, no obtuve resultados inesperados (no falté al respeto, pero estoy escribiendo desde una perspectiva de principiante ya que soy una nube de filtro cruzado). Los errores son la necesidad de limpiar los filtros antes de llamar a algunos filtros (deberá ampliar el conjunto de datos con más variedad, por ejemplo, diferentes consejos, totales, etc. para ver a qué me refiero). Salir a la consola me ayuda.
Esto es lo que ayuda a mi comprensión:
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);
Podría 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ó, así.
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, de modo que la última línea en realidad es el resultado de todos los valores que respetan todos los filtros de todas las dimensiones.