Использование crossfilter для динамического возвращения результатов в JavaScript
Я чувствую, что объяснение API библиотеки crossfilter написано для кого-то выше моего набора навыков, но я также знаю, что освоение его решит мою проблему.
Чтобы сделать это простым, я буду ссылаться на примеры данных API Страница для этого вопроса.
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"}
]);
Я могу вернуть записи, соответствующие конкретному ключу (количество, сумма и т.д.), но я не понимаю, как возвращать результаты, которые соответствуют комбинации пар ключ/значение. Например, как бы я вернул результирующий набор, который соответствовал результатам с количеством более 1, общим равным 90, вершиной равным 0 и типом табуляции? Здесь я полностью потерялся.
Как всегда, любая помощь будет оценена.
Ответы
Ответ 1
Вы можете создать измерение для каждого атрибута, а затем вызвать каждый метод размерного фильтра с соответствующими указанными вами критериями фильтра.
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)
Эффекты являются кумулятивными, так что последняя строка фактически является результатом всех значений, относящихся ко всем фильтрам из всех измерений.
Ответ 2
Я нашел указанный ответ точным, но неточным для меня как новичка, т.е. у меня не было никаких или неожиданных результатов (без неуважения slo-jo, но я пишу с новичка, поскольку я - кроссфильтр).
Захваты - это необходимость очистки фильтров перед вызовом некоторых фильтров (вам нужно будет расширить набор данных с большим разнообразием, например, разными советами, суммами и т.д., Чтобы понять, что я имею в виду). Вывод на консоль помогает мне.
Вот что помогает моему пониманию:
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);