使用交叉过滤器在 JavaScript 中动态返回结果
Using crossfilter to dynamically return results in JavaScript
我觉得交叉过滤器库 API 解释是为我的技能集以上的人编写的,但我也知道掌握它会解决我的问题。
为简单起见,我将在此问题中引用 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 和选项卡类型匹配的结果集?这就是我完全迷失的地方。
您可以为每个属性创建一个维度,然后使用您指定的相应筛选条件调用每个维度的筛选方法,如下所示。
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)
效果是累积的,因此最后一行实际上是所有值的结果,这些值都遵循所有维度的所有过滤器。
我发现上面的答案很精确,但对我来说是初学者,即我没有得到或意想不到的结果(没有不尊重 slo-jo,但我是从初学者的角度写的,因为我是一个交叉过滤器 nube)。陷阱是在调用某些过滤器之前需要清除过滤器(您需要使用更多种类扩展数据集,例如不同的提示、总数等,以了解我的意思)。输出到控制台对我有帮助。
以下是有助于我理解的内容:
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);
相关文章:
- post()向服务器动态生成的数据返回空响应
- 将从控制器返回的selectbox值动态呈现为json
- 返回动态标题的$stateParams
- 使用动态键返回不可变状态
- 动态添加的输入元素不会在脚本中返回值
- 动态弹出窗口'通过调用一个永远运行并返回's每个周期后的数据
- 使用getElementByIdJavascript/PHP隐藏基于sql返回值的动态表
- 如何实现动态生成html的返回按钮
- Native Phonegap、下载并创建文件、动态命名文件和返回路径
- 使用数据库返回的数据动态填充下拉列表
- 试图在网站上抓取谷歌地图api生成的动态数据,但正常抓取返回空白
- 使用 jQuery 创建动态元素 单击事件始终返回 for 循环中的最后一个索引
- FetchXML 查询在子网格中返回的动态 CRM 2015 中的活动记录 - 主题超链接将打开新的活动
- 代码点火器动态表单下拉列表,不返回值,而是返回 ID
- 包含动态内容的较长页面上的返回顶部链接
- 使用交叉过滤器在 JavaScript 中动态返回结果
- 追加函数中的动态返回值
- 如何处理php给出的多行动态返回值
- 从控制器动态返回javascript函数并将其传递给cshtml
- 函数,动态返回已执行的代码量