首页 > 解决方案 > 不同形状的交叉过滤数据

问题描述

我刚刚开始使用交叉过滤器。我对数据的经验很少。

我的数据如下所示:

const data = [
  {_id: 001, a: 10, b: 11, c:  12},
  {_id: 002, a: 11,        c:  13},
  {_id: 003,        b: 12, c:  14},
  {_id: 004,        f: 102       },  
  {_id: 005, e:100, f:101, g: 102}
];

如您所见,并非每个对象都具有相同或公共的键。我得到的值不正确

dimension.top(), dimension.bottom() 

例如:

const by_a = cf.dimension(function(d){return d.a};
const max_a = by_a.top(1)[0];
// Should be max_a =  { _id: 002, a: 11, c:  13}
// Instead returns wrong object,

const by_f = cf.dimension(function(d){return d.f};
const min_f = by_f.bottom(1)[0];
// Should be min_f = { _id: 004, e:100, f:101, g: 102}
// Wrong object again. 

我阅读了Crossfilter Gotchas但无法理解是否有任何适用于此,或者这种情况是否有解决方案。我也没有遇到类似的问题。我希望能够运行基本的交叉过滤查询。任何帮助深表感谢。谢谢。

标签: javascriptcrossfilter

解决方案


是的,这正是问题之一。如果您尝试读取 JavaScript 中的字段但它不存在,则默认值为undefined.

然后,如果您将其与一个数字进行比较,它将强制为NaN.

并且NaN总是比较假,这搞砸了排序算法。

如果你像这样定义你的关键功能,你应该得到想要的(或至少可预测的)行为:

const by_a = cf.dimension(function(d){return d.a || 0; };

或者,如果您希望它们始终位于底部,即使存在负数:

const by_a = cf.dimension(function(d){return d.a || -Infinity; };

我在“自然排序”问题中添加了一个示例。


推荐阅读