我们有时候需要对数组中的对象进行合并,根据对象的某一个属性相同的进行合并
let boxSortArr = [
{ id: 51001, num: 1 },
{ id: 51002, num: 1 },
{ id: 51003, num: 1 },
{ id: 51004, num: 1 },
{ id: 51001, num: 1 },
{ id: 51002, num: 1 },
{ id: 51003, num: 1 },
{ id: 51001, num: 1 },
{ id: 51001, num: 1 },
{ id: 51001, num: 1 },
{ id: 51001, num: 1 },
{ id: 51001, num: 1 },
{ id: 51001, num: 1 },
{ id: 51001, num: 1 },
{ id: 51001, num: 1 },
{ id: 51001, num: 1 },
{ id: 51001, num: 1 },
{ id: 51001, num: 1 },
{ id: 51001, num: 1 },
{ id: 51001, num: 1 },
{ id: 51001, num: 1 },
{ id: 51001, num: 1 },
{ id: 51001, num: 1 },
{ id: 51001, num: 1 },
{ id: 51001, num: 1 },
{ id: 51001, num: 1 },
{ id: 51001, num: 1 },
{ id: 51001, num: 1 },
{ id: 51001, num: 1 },
{ id: 51001, num: 1 },
{ id: 51001, num: 1 },
{ id: 51001, num: 1 },
{ id: 51001, num: 1 },
{ id: 51001, num: 1 },
{ id: 51001, num: 1 },
{ id: 51001, num: 1 },
{ id: 51001, num: 1 },
];
对上面这个id相同的合并,把num值进行累加
这个解决问题思想是这样的,先准备一个空数组resArr,遍历boxSortArr原始数组,如果resArr有这个对象,就就num属性进行累加,否则就往这个结果数组往resArr push一个对象
let resArr = [];
boxSortArr.forEach((el) => {
let resIndex = resArr.findIndex(item => {
return el.id === item.id ;
});
if (resIndex !== -1) {
let target = resArr[resIndex];
target.num = target.num + el.num;
} else {
resArr.push({
id: el.id,
num: el.num,
});
}
}
);
运行结果
如果我们要求这个合并结果的num不能超过10个,就需要多加一个条件就可以了
//先id相同的进行宝箱数量合并
let boxResArr = [];
boxSortArr.forEach((el) => {
let resIndex = resArr.findIndex(item => {
//当前item在resArr中,是否满足这个条件
return el.id === item.id && item.num < 10;
});
if (resIndex !== -1) {
let target = resArr[resIndex];
target.num = target.num + el.num;
} else {
resArr.push({
id: el.id,
num: el.num,
});
}
});
运行结果