我正在尝试通过删除具有相同 code 属性的对象并计算其 times 属性来合并对象数组。
给定以下数组:
let itemsTimes = [
{
item: {
code: '0.05'
},
times: 1
},
{
item: {
code: '0.01'
},
times: 1
},
{
item: {
code: '0.02'
},
times: 1
},
{
item: {
code: '0.01'
},
times: 1
},
{
item: {
code: '0.02'
},
times: 2
}
];
以及以下代码:
let mergedItemTimes = [];
itemsTimes.forEach((itemTime, i) => {
let j = i + 1
if ((itemsTimes[j])) {
itemsTimes.forEach((_, j) => {
if (itemTime.item.code === itemsTimes[j].item.code) {
itemTime.times += itemsTimes[j].times
itemsTimes.splice(j, 1)
}
})
}
mergedItemTimes.push(itemTime)
})
预期输出将是:
[
{ item: { code: '0.05' }, times: 1 },
{ item: { code: '0.01' }, times: 2 },
{ item: { code: '0.02' }, times: 3 },
]
但它给了我:
[
{ item: { code: '0.05' }, times: 2 },
{ item: { code: '0.02' }, times: 4 },
]
提前致谢。
当您在正在迭代的数组上调用
splice
时,该循环将不会访问下一个元素,因为该元素转移到前一个索引,并且迭代在下一个索引处继续。
执行此操作的常见方法之一是使用
reduce
——不改变原始对象或数组:
const itemsTimes = [{item: {code: '0.05'},times: 1},{item: {code: '0.01'},times: 1},{item: {code: '0.02'},times: 1},{item: {code: '0.01'},times: 1},{item: {code: '0.02'},times: 2}];
const mergedItemTimes = Object.values(
itemsTimes.reduce((acc, { item: { code }, times }) => {
(acc[code] ??= { item: { code }, times: 0 }).times += times;
return acc;
}, {})
);
console.log(mergedItemTimes);