簡體   English   中英

復制對象數組並在不修改原始數組的情況下進行更改

[英]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 中復制數組,我認為最常用的是:

  • 片()
  • 數組.from()

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"]

更多關於切片

更多關於 Array.from()

React JS中,我嘗試了大多數復制和修改新復制的數組的方法,但它仍然修改了原始數組。 我嘗試的方法是slice Array.from for loop spread operator ,所有這些最終都修改了原始數組。 解決方案是,將原始數組stringify並將其分配給一個新變量,然后parse該變量以獲得一個新的副本,而無需引用,如上面@Roman Yakoviv 所述。

暫無
暫無

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

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