我想减少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
调用Newarray.Push(currentItem)
时,您正在将对象从Items
添加到Newarray
中。 Newarray
将保存与items
中相同的对象(具有相同的引用)。 以后调用newarray[indexForCurrentItem].qty+=CurrentItem.qty
时,将更新两个数组中都存在的对象。
一个简单的修复方法是将对象的副本添加到新数组中。
newArray.push(Object.assign({}, currentItem))
通过此更改,Newarray
将保存对象的(浅)副本。 如果更改副本,items
中的原件将不受影响。