所以我有下一个信息,我想要实现的是过滤对象数组并对重复对象的数量求和
//Original Data
var data = {
sublists = [
{ item: 1, qty: 2},
{ item: 2, qty: 2},
{ item: 3, qty: 2},
{ item: 1, qty: 5}
{ item: 3, qty: 3}
],
...
};
//This is what I want to achieve
var result = {
sublists = [
{ item: 1, qty: 7},
{ item: 2, qty: 2},
{ item: 3, qty: 5}
],
...
};
到目前为止,我得到的是重复的项目名称和具有该变量数据的对象
var repeatedObjects = {
1: [{ item: 1, qty: 2}, { item: 1, qty: 5}],
3: [{ item: 3, qty: 2}, { item: 3, qty: 3}]
}
var repeatedItems = [1, 3];
但是我坚持减少对象,这样我就可以获得原始数据,其中只有一个重复对象以及所有对象的总和。有什么想法吗?
创建一个 itemByFreq json 对象,如下所示
var data = {
sublists : [
{ item: 1, qty: 2},
{ item: 2, qty: 2},
{ item: 3, qty: 2},
{ item: 1, qty: 5},
{ item: 3, qty: 3}
]
};
var itemByFreq = {};
for(var i=0;i<data.sublists.length;i++){
var ji = data.sublists[i];
itemByFreq[ji.item] = (itemByFreq[ji.item] || 0) + ji.qty;
}
console.log(itemByFreq);
var duplicateItems = [];
for(var key in itemByFreq)
duplicateItems.push({item: key,qty: itemByFreq[key]});
console.log(duplicateItems);
如果您喜欢使用
lodash
在一行中完成此操作,您也可以使用这个
const _ = require("lodash");
const data = [
{"item": 1, "qty": 2},
{"item": 2, "qty": 2},
{"item": 3, "qty": 2},
{"item": 1, "qty": 5},
{"item": 3, "qty": 3}
];
const result = _.map(_.groupBy(data, i => i.item), (o, idx) => {
return {"item": idx, "qty": _.sumBy(o, i => i.qty)};
});
console.log(result);
可以使用
Map
和 reduce
来完成
const dataSample = {
sublists: [
{ item: 1, qty: 2},
{ item: 2, qty: 2},
{ item: 3, qty: 2},
{ item: 1, qty: 5},
{ item: 3, qty: 3}
],
};
const mergeItems = list => {
return [...list.reduce((acc, val) => {
const oldVal = acc.get(val.item) || { qty: 0 }
const newVal = {
...val,
qty: oldVal.qty + val.qty
}
acc.set(val.item, newVal)
return acc
}, new Map()).values()]
}
console.log(mergeItems(dataSample.sublists))
使用
reduce
会简化
const update = data =>
Object.values(
data.sublists.reduce((acc, curr) => {
acc[curr.item] =
curr.item in acc
? { ...acc[curr.item], qty: acc[curr.item].qty + curr.qty }
: { ...curr };
return acc;
}, {})
);
var data = {
sublists: [
{ item: 1, qty: 2 },
{ item: 2, qty: 2 },
{ item: 3, qty: 2 },
{ item: 1, qty: 5 },
{ item: 3, qty: 3 }
]
};
const res = { sublists: update(data) };
console.log(res);