我有一个长度为n的对象数组,我想将其扩展为长度n + 1。为了易于使用,我想复制最后一个元素,然后更改副本的属性。
let arr = [{id: 1, name: 'foo'}, {id: 2, name: 'bar'}];
arr.push(arr[1]); // extend by copying the last
arr[2].id += 1; // change the id of the new last
arr[2].name = 'foobar'; // change the name of the new last
console.log(arr);
在上面的代码段中(使用浏览器控制台,因为代码段控制台在这里有点怪异)是我尝试过的操作,但是由于某些原因,对复制的/新的last元素的任何更改也将应用于原始的/旧的last /数组中新的倒数第二个元素。
如何正确执行此操作,为什么我的代码会表现出这种行为?
答案 0 :(得分:1)
您可以推送对象的副本并省略相同的对象引用。
let arr = [{id: 1, name: 'foo'}, {id: 2, name: 'bar'}];
arr.push({ ...arr[1] }); // extend by copying the last
arr[2].id += 1; // change the id of the new last
arr[2].name = 'foobar'; // change the name of the new last
console.log(arr);
答案 1 :(得分:1)
const arr = [{id: 1, name: 'foo'}, {id: 2, name: 'bar'}];
const lastEl = Object.assign({}, arr[1]);
lastEl.id = 4;
lastEl.name = 'foo';
arr.push(lastEl);
console.log(arr);