使用crossfilter.js进行多维分组和排序

时间:2015-07-31 16:27:40

标签: javascript underscore.js lodash crossfilter

我正在尝试重构一些数据。这是一个对象数组。我查看了lodash的链接功能,并会接受使用lodash的答案,但我想知道crossfilter是否更合适。这个数组中可能有10000到100000个元素。

1)我想要实现的例子最好的描述是我最终得到了一个对象数组,这些对象已经按'oJK'键分组但是每个'oJK都有一个唯一排序价格的数组”。并且数组按每个对象价格数组的最低(元素[0])排序。

我已经使用我的示例数据/尝试设置了一个jsfiddle:

https://jsfiddle.net/handloomweaver/ffx9fgou/

如果我这样做

cf = crossfilter();

cf.add(data);

price = cf.dimension(function(d) {
  return d.oJK;
});

groups = price.group()。all();

我得到:

[ { key: '420973:421065:20150801:1829137', value: 16 },
  { key: '420973:421065:20150801:1831518', value: 1 },
  { key: '420973:421065:20150801:1832059', value: 2 },
  { key: '420973:421065:20150801:1833610', value: 1 } ]

或者如果我

price = cf.dimension(function(d) {
  return d.price;
});
groups = price.group().all();

我得到了

[ { key: 4400, value: 1 },
  { key: 4700, value: 1 },
  { key: 4900, value: 1 },
  { key: 5000, value: 1 },
  { key: 5100, value: 1 },
  { key: 5150, value: 1 },
  { key: 5300, value: 1 },
  { key: 5400, value: 3 },
  { key: 5430, value: 8 },
  { key: 5483, value: 2 } ]

每个'oJK'或第二个例子中每个'价格'上的哪些组,但我想要的是喜欢第一个(在'oJK'上分组),然后获得与该'oJK'键相关联的每个价格价格最低,整个数组按最低排序(价格数组的元素[0])。

排序

[ { 'oJK': '420973:421065:20150801:1829137', 'prices': [4400, 4700, 4900, 5100, 5400, 5430, 5483]},
  { 'oJK': '420973:421065:20150801:1832059', 'prices': [5000, 5300] },
  { 'oJK': '420973:421065:20150801:1831518', 'prices': [5150] },
  { 'oJK': '420973:421065:20150801:1833610', 'prices': [5400]} ]

这似乎是一个非常复杂的例子,我找不到任何类似的东西,我可以从中学习。

1 个答案:

答案 0 :(得分:2)

您可以使用标准功能来执行此操作。像

这样的东西
var map = {};
data.forEach(function(d) {
    if(map[d.oJK]) {
        map[d.oJK].push(d.price);
    } else {
        map[d.oJK] = [ d.price ];
    }
});

for(key in map) {
    map[key] = map[key].sort();
}

这是你小提琴的一个版本:https://jsfiddle.net/zkanp56y/