[英]Copy array of objects and make changes without modifying original array
我有一個對象數組。 我想深度復制對象數組並對每個 object 進行一些更改。 我想在不修改原始數組或該數組中的原始對象的情況下執行此操作。
我就是這樣做的。 但是,作為 JavaScript 的新手,我想確保這是一個好方法。
有一個更好的方法嗎?
const users =
[
{
id : 1,
name : 'Jack',
approved : false
},
{
id : 2,
name : 'Bill',
approved : true
},
{
id : 3,
name : 'Rick',
approved : false
},
{
id : 4,
name : 'Rick',
approved : true
}
];
const users2 =
users
.map(
(u) =>
{
return Object.assign({}, u);
}
)
.map(
(u) =>
{
u.approved = true;
return u;
}
);
console.log('New users2 array of objects:')
console.log(users2);
console.log('This was original users array is untouched:')
console.log(users);
Output:
New users2 array of objects:
[ { id: 1, name: 'Jack', approved: true },
{ id: 2, name: 'Bill', approved: true },
{ id: 3, name: 'Rick', approved: true },
{ id: 4, name: 'Rick', approved: true } ]
This was original users array is untouched:
[ { id: 1, name: 'Jack', approved: false },
{ id: 2, name: 'Bill', approved: true },
{ id: 3, name: 'Rick', approved: false },
{ id: 4, name: 'Rick', approved: true } ]
對於單次傳遞,您也可以將Object.assign
與更改的屬性一起使用。
const users = [{ id: 1, name: 'Jack', approved: false }, { id: 2, name: 'Bill', approved: true }, { id: 3, name: 'Rick', approved: false }, { id: 4, name: 'Rick', approved: true }]; const users2 = users.map(u => Object.assign({}, u, { approved: true })); console.log(users2); console.log(users);
.as-console-wrapper { max-height: 100% !important; top: 0; }
更新傳播屬性。
const users = [{ id: 1, name: 'Jack', approved: false }, { id: 2, name: 'Bill', approved: true }, { id: 3, name: 'Rick', approved: false }, { id: 4, name: 'Rick', approved: true }]; const users2 = users.map(u => ({ ...u, approved: true })); console.log(users2); console.log(users);
.as-console-wrapper { max-height: 100% !important; top: 0; }
是的,看起來不錯。 您也可以在克隆時執行修改,以避免兩次映射數組。
const users2 = users.map((u) => {
const copiedUser = Object.assign({}, u);
copiedUser.approved = true;
return copiedUser;
});
我更喜歡 JSON.stringify 和 JSON.parse
var users = [ { id: 1, name: 'Jack', approved: false },
{ id: 2, name: 'Bill', approved: true },
{ id: 3, name: 'Rick', approved: false },
{ id: 4, name: 'Rick', approved: true } ];
// user2 will be copy of array users without reference
var users2 = JSON.parse(JSON.stringify(users));
有幾種方法可以在 javascript 中復制數組,我認為最常用的是:
slice 函數將返回給定數組的一部分(或所有內容)作為新數組,基於開始和結束索引(開始和結束索引是可選的):
const a = [1,2,3,4,5,6,7,8,9] /* * Only begin index */ const b = a.slice(2) console.log(b) //Will Print [3,4,5,6,7,8,9] /* * Begin index and end index */ const c = a.slice(5,8) console.log(c) //Will Print [6,7,8] /* * No indexes provided */ const d = a.slice() console.log(d) //Will print [1,2,3,4,5,6,7,8,9]
Array.from() 是一個函數,它將從類似數組或可迭代的參數創建一個新數組。
const a = Array.from('bar'); console.log(a) //Will Print ["b","a","r"] const b = ["for","bar"]; const c = Array.from(b); console.log(c) //Will print ["for","bar"]
在React JS
中,我嘗試了大多數復制和修改新復制的數組的方法,但它仍然修改了原始數組。 我嘗試的方法是slice
Array.from
for loop
spread operator
,所有這些最終都修改了原始數組。 解決方案是,將原始數組stringify
並將其分配給一個新變量,然后parse
該變量以獲得一個新的副本,而無需引用,如上面@Roman Yakoviv 所述。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.