簡體   English   中英

使用for-of更新數組對象

[英]Update array objects using for-of

我有以下兩個對象數組。 我想做的是如果id屬性匹配,則將數組x項替換為數組y項。

我可以通過一個普通的for循環輕松實現此目的。 但是我不明白為什么我的for-of循環會返回不同的結果。

 let x1 = [{ id: '1', a: 1, b: 2 }]; let y1 = [{ id: '1', c: 3, b: 2 }]; let x2 = [{ id: '1', a: 1, b: 2 }]; let y2 = [{ id: '1', c: 3, b: 2 }]; let updateX1 = (x, y) => { for (let itemY of y) { for (let itemX of x) { if (itemY.id === itemX.id) { itemX = itemY; } } } return x; } let updateX2 = (x, y) => { for (let i = 0; i < y.length; i++) { for (let j = 0; j < x.length; j++) { if (y[i].id === x[j].id) { x[j] = y[i]; } } } return x; } console.log(updateX1(x1, y1)); console.log(updateX2(x2, y2)); 

為什么上述兩種方法會得到兩種不同的結果? 提前致謝!

本身重新分配變量將永遠不會使現有對象發生突變,或者至少不會在非常奇怪的情況下進行突變。 當你做

itemX = itemY;

您只是將itemX變量指向的值更改為itemY 最初的itemX以及itemX來自的對象將不會更改。 為了使對象變異,您必須始終為對象的屬性顯式分配一個新值,例如obj.fooobj['foo']或如代碼中的x[j] = y[i];

如果您實際上想說的是:

如果id屬性匹配,則將數組x項替換為數組y項

然后可以使用mapfind來代替嵌套循環:

 const x = [ { id: 1, name: 'should be replaced by y' }, { id: 2, name: 'not replaced' }, ]; const y = [ { id: 1, name: 'this is from y' }, { id: 3, name: 'not not used' }, ]; const newX = x.map((xItem) => { const fromY = y.find((yItem) => yItem.id === xItem.id); return fromY ? fromY : xItem; }); console.log(newX); 

如果您要進行突變,則可以使用forEach ,因為它更適合副作用

 const x = [ { id: 1, name: 'should be replaced by y' }, { id: 2, name: 'not replaced' }, ]; const y = [ { id: 1, name: 'this is from y' }, { id: 3, name: 'not not used' }, ]; //mutate x x.forEach((xItem, index) => { const fromY = y.find((yItem) => yItem.id === xItem.id); x[index] = fromY ? fromY : xItem; }); console.log(x); 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM