具有不同形状的交叉过滤器数据

时间:2018-07-21 07:11:54

标签: javascript 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,但不知道是否有任何适用于此的方法,或者这种情况是否可以解决。我也没有遇到类似的问题。我希望能够运行基本的交叉过滤器查询。任何帮助深表感谢。谢谢。

2 个答案:

答案 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或其他一些库过滤掉不包含相关维度的对象。

谢谢。