使用 crossfilter.js 进行多维分组和排序
multi-dimensional grouping and sorting with crossfilter.js
我正在尝试重构一些数据。它是一个对象数组。我看过 lodash 的链接函数,并会接受使用 lodash 的答案,但我想知道 crossfilter 是否更合适。此数组中可能有 10000 到 100000 个元素。
1) 我想要实现的示例最好的描述是我最终得到一个对象数组,这些对象已按 'oJK' 键分组但具有唯一排序价格的数组对于每个 'oJK'。并且数组按每个对象价格数组的最低(元素[0])排序。
我已经用我的示例设置了一个 jsfiddle data/attempt:
https://jsfiddle.net/handloomweaver/ffx9fgou/
如果我这样做
cf = crossfilter();
cf.add(data);
price = cf.dimension(function(d) {
return d.oJK;
});
组 = 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' 或第二个示例中的每个 'price' 分组,但我想要的是喜欢第一个(按 '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]} ]
这似乎是一个相当复杂的例子,我找不到任何类似的东西可以学习。
您或许可以使用标准函数来完成此操作。像
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();
}
这是您的 fiddle 的一个版本:https://jsfiddle.net/zkanp56y/
我正在尝试重构一些数据。它是一个对象数组。我看过 lodash 的链接函数,并会接受使用 lodash 的答案,但我想知道 crossfilter 是否更合适。此数组中可能有 10000 到 100000 个元素。
1) 我想要实现的示例最好的描述是我最终得到一个对象数组,这些对象已按 'oJK' 键分组但具有唯一排序价格的数组对于每个 'oJK'。并且数组按每个对象价格数组的最低(元素[0])排序。
我已经用我的示例设置了一个 jsfiddle data/attempt:
https://jsfiddle.net/handloomweaver/ffx9fgou/
如果我这样做
cf = crossfilter();
cf.add(data);
price = cf.dimension(function(d) {
return d.oJK;
});
组 = 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' 或第二个示例中的每个 'price' 分组,但我想要的是喜欢第一个(按 '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]} ]
这似乎是一个相当复杂的例子,我找不到任何类似的东西可以学习。
您或许可以使用标准函数来完成此操作。像
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();
}
这是您的 fiddle 的一个版本:https://jsfiddle.net/zkanp56y/