合并数组中的javascript对象

问题描述 投票:0回答:1

我正在尝试通过删除具有相同 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 },
]

提前致谢。

javascript arrays foreach logic javascript-objects
1个回答
0
投票

当您在正在迭代的数组上调用

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);

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.