提问者:小点点

这个reduce操作是如何改变我的原始数组的?


我想减少items数组,使其包含一个带有更新数量的“Apple”元素。 下面的代码返回正确的缩减数组,但它也改变了原始的items数组,我不明白为什么。

null

const items = [
    {name: "apples", qty: 1},
    {name: "bananas", qty: 1},
    {name: "apples", qty: 3}
];

const reducedItems = items.reduce(function(newArray, currentItem) {
    const indexForCurrentItem = newArray.findIndex(
        ({name}) => name === currentItem.name
    );
    // if current item is not in newArray, add it
    // but if it is already in newArray, update its quantity property there
    indexForCurrentItem === -1
        ? newArray.push(currentItem)
        : newArray[indexForCurrentItem].qty += currentItem.qty;
    return newArray;
}, []);

console.log(reducedItems);
console.log(items);

// reducedItems is correct: [{name: "apples", qty: 4}, {name: "bananas", qty: 1}]

// but items is now:
//  [
//      {name: "apples", qty: 4},
//      {name: "bananas", qty: 1},
//      {name: "apples", qty: 1}
//  ]

null


共1个答案

匿名用户

调用Newarray.Push(currentItem)时,您正在将对象从Items添加到Newarray中。 Newarray将保存与items中相同的对象(具有相同的引用)。 以后调用newarray[indexForCurrentItem].qty+=CurrentItem.qty时,将更新两个数组中都存在的对象。

一个简单的修复方法是将对象的副本添加到新数组中。

newArray.push(Object.assign({}, currentItem))

通过此更改,Newarray将保存对象的(浅)副本。 如果更改副本,items中的原件将不受影响。