Подтвердить что ты не робот

Использование 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 и типом табуляции? Здесь я полностью потерялся.

Как всегда, любая помощь будет оценена.

4b9b3361

Ответ 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);