underscore.js 的 groupBy 对象数组
groupBy array of objects with underscore.js
我有一个对象数组 (order) (products): ,我想按 id 对所有这些产品进行分组和计数:
var order = [
{ product_id: 70, product_price: 9, product_color: "ccc"},
{ product_id: 70, product_price: 9, product_color: "ccc"},
{ product_id: 71, product_price: 10, product_color: "fff" } ];
与 Underscore.js:
var groups = _.countBy(order, function(value){
return value.product_id + "#" + value.product_price + "#" + value.product_color;
})
//--> Object {70#ccc#9: 2, 71#fff#10: 1}
所以它有效……但是现在,我如何才能 return 将这些值放入这样的数组中,以便我可以将其用作新的对象数组?
[
{ product_id: 70, product_price: 9, product_color: "ccc", count: 2},
{ product_id: 70, product_price: 9, product_color: "fff", count: 1}
];
您可以跨组使用 groupBy and then map 来添加计数,而不是 countBy:
var groups = _.groupBy(order, function(value){
return value.product_id + "#" + value.product_price + "#" + value.product_color;
})
groups = _.map(groups, function(group){
return _.extend(group[0], {count: group.length});
});
您可以使用 reduce 重新创建原始数组。
var countedById = [
{ product_id: 70, product_price: 9, product_color: "ccc", count: 2},
{ product_id: 70, product_price: 9, product_color: "fff", count: 1}
];
var original = countedById.reduce((acc, cur) => {
for (var i = 0; i < cur.count; i++) {
var original = {
product_id: cur.product_id,
product_price: cur.product_price,
product_color: cur.product_color
}
acc.push(original);
}
return acc;
}, []);
document.write(JSON.stringify(original))
我有一个对象数组 (order) (products): ,我想按 id 对所有这些产品进行分组和计数:
var order = [
{ product_id: 70, product_price: 9, product_color: "ccc"},
{ product_id: 70, product_price: 9, product_color: "ccc"},
{ product_id: 71, product_price: 10, product_color: "fff" } ];
与 Underscore.js:
var groups = _.countBy(order, function(value){
return value.product_id + "#" + value.product_price + "#" + value.product_color;
})
//--> Object {70#ccc#9: 2, 71#fff#10: 1}
所以它有效……但是现在,我如何才能 return 将这些值放入这样的数组中,以便我可以将其用作新的对象数组?
[
{ product_id: 70, product_price: 9, product_color: "ccc", count: 2},
{ product_id: 70, product_price: 9, product_color: "fff", count: 1}
];
您可以跨组使用 groupBy and then map 来添加计数,而不是 countBy:
var groups = _.groupBy(order, function(value){
return value.product_id + "#" + value.product_price + "#" + value.product_color;
})
groups = _.map(groups, function(group){
return _.extend(group[0], {count: group.length});
});
您可以使用 reduce 重新创建原始数组。
var countedById = [
{ product_id: 70, product_price: 9, product_color: "ccc", count: 2},
{ product_id: 70, product_price: 9, product_color: "fff", count: 1}
];
var original = countedById.reduce((acc, cur) => {
for (var i = 0; i < cur.count; i++) {
var original = {
product_id: cur.product_id,
product_price: cur.product_price,
product_color: cur.product_color
}
acc.push(original);
}
return acc;
}, []);
document.write(JSON.stringify(original))