我刚开始使用 crossfilter。我对数据没有什么经验。
我的数据是这样的:
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但我无法理解其中是否适用于此,或者这种情况是否有解决方案。我也没有遇到类似的问题。我希望能够运行基本的交叉过滤器查询。任何帮助深表感谢。谢谢。
最佳答案
是的,这正是陷阱之一。如果您尝试读取 JavaScript 中的某个字段但该字段不存在,则默认值为 undefined
。
然后,如果您将其与数字进行比较,它将强制转换为 NaN
。
NaN
总是比较 false,这会搞砸排序算法。
如果你这样定义你的关键函数,你应该得到期望的(或至少可预测的)行为:
const by_a = cf.dimension(function(d){return d.a || 0; };
或者如果您希望它们始终位于底部,即使出现负数也是如此:
const by_a = cf.dimension(function(d){return d.a || -Infinity; };
我在“自然排序”陷阱中添加了一个示例。
关于javascript - 具有不同形状的交叉过滤数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51453750/