我有一个对象数组:
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
答案 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