javascript - 复制对象数组并在不修改原始数组的情况下进行更改

标签 javascript arrays ecmascript-6 immutability

我有一个对象数组。我想深入复制对象数组并对每个对象进行一些更改。我想在不修改原始数组或该数组中的原始对象的情况下执行此操作。

这就是我的做法。然而,作为 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);

输出:

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; }

关于javascript - 复制对象数组并在不修改原始数组的情况下进行更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45512723/

相关文章:

javascript - 如何将 json 编码的变量从 .php 传递到外部 .js?

Javascript数组拼接导致内存不足异常?

java - 我如何使用 Arrays.toString(reverse) 打印我的数组而不使用 []

javascript - 无法从 Promise 函数接收正确的数据

javascript - Twilio 浏览器记住 WebRTC 的麦克风权限

javascript - Bootstrap 未按预期工作

javascript - 如何从 Dijit FilteringSelect 小部件中删除所有选项?

python - Numpy 无法将列表转换为 np 数组

reactjs - import React 和 import { Component } 语法之间的区别

ecmascript-6 - 如何在不每次都初始化模块的情况下在 Vue 组件中加载 WASM 模块?