更改复制的数组,更新原始数据?

时间:2018-01-30 19:46:54

标签: javascript

我有一个对象数组:

 let users = [{name: 'john', address: '10 king street'}, ....];

我通过以下方式复制这个数组:

let usersCopy = users.slice(0);

然后,如果我做

usersCopy[0].name = jeff;

它还在原始用户数组上更新了这个:

console.log(usersCopy[0].name) //jeff
console.log(users[0].name) //jeff

我期待看到:

console.log(usersCopy[0].name) //jeff
console.log(users[0].name) //john

2 个答案:

答案 0 :(得分:3)

因为[].slice()执行了副本,这意味着您获得了一个新数组,但它并没有克隆下面的对象。因此,users[0] === usersCopy[0],因为它们是对同一对象的相同引用。

您需要完全替换usersCopy[0]。例如:

usersCopy[0] = {...usersCopy[0], name: 'jeff'}

这将创建一个新对象,其中包含从usersCopy[0]浅层复制到其中的所有内容。

答案 1 :(得分:1)

编辑:如下所示,此答案不正确

这是另一种从原始数组创建单独数组的方法,因此您可以修改clone



const users = [{name: 'John', address: '10 king street'}];
const clone = new Array(users);

clone[0].name = 'Jeff';

console.log(clone[0].name) //jeff
console.log(users[0].name) //john