我刚刚开始使用交叉过滤器。我对数据的经验很少。
我的数据如下:
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,但不知道是否有任何适用于此的方法,或者这种情况是否可以解决。我也没有遇到类似的问题。我希望能够运行基本的交叉过滤器查询。任何帮助深表感谢。谢谢。
答案 0 :(得分:1)
是的,这恰恰是陷阱之一。如果您尝试读取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; };
我在“自然排序”陷阱中添加了一个示例。
答案 1 :(得分:0)
这是我根据戈登的建议得出的结果。考虑以下数据集:
const data = [
{_id: "001", a: 10, b: 11, c: 12},
{_id: "002", a: 11, c: 13},
{_id: "003", a:-11, c: 13},
{_id: "004", a: 0, c: 13},
{_id: "005", b: 12, c: 14},
{_id: "006", f: 102 },
{_id: "007", e:100, f: 101,g: 102}
];
使用回调,如果缺少字段,则返回默认值零:
// Where dim is the field I'm dimensioning the data by
const by_dim = cf.dimension( d => d.dim || 0 );
// Logging the results of by_a.top(7)
0:{_id: "002", a: 11, c: 13} // Correct
1:{_id: "001", a: 10, b: 11, c: 12} //Correct
2:{_id: "007", e: 100, f: 101, g: 102} //Incorrect
3:{_id: "006", f: 102}
4:{_id: "005", b: 12, c: 14}
5:{_id: "004", a: 0, c: 13} //Should have been at index 2
6:{_id: "003", a: -11, c: 13} // Should have been at index 3
// Logging the results of by_a.bottom(7)
0:{_id: "003", a: -11, c: 13} // Correct
1:{_id: "004", a: 0, c: 13} // Correct
2:{_id: "005", b: 12, c: 14} // Incorrect
3:{_id: "006", f: 102}
4:{_id: "007", e: 100, f: 101, g: 102}
5:{_id: "001", a: 10, b: 11, c: 12} //Should have been at index 2
6:{_id: "002", a: 11, c: 13} //Should have been at index 3 ..
当缺少字段时,似乎在尺寸标注回调中返回0
,将这些对象放置在包含该字段的对象之间,并带有值 >0
和=< 0
。但这对我来说很有用,因为我可以使用Lodash或其他一些库过滤掉不包含相关维度的对象。
谢谢。