问题描述
我对扩展运算符如何在对象数组上工作感到有些困惑。假设我有一个对象数组,例如:
const array = [
{ name: 'Object 1',body: '123'},{ name: 'Object 2',body: '456'}];
如果我制作一个克隆并在克隆上使用拼接:
const cloneArray = [...array];
const newObject = { name: 'Object 3',body: '789'}
cloneArray.splice(1,1,newObject);
我会:
const array = [
{ name: 'Object 1',body: '456'}];
const cloneArray = [
{ name: 'Object 1',{ name: 'Object 3',body: '789'}];
只修改克隆的数组。展开运算符不应该制作初始数组的浅拷贝,并强迫我深度克隆所有对象? 我在这里错过了什么?
解决方法
您没有修改数组条目。
splice
替换一个数组条目。将这些对象视为指向一块内存的指针:
const array = [A,B];
const cloneArray = [...array];
// ^ cloneArray = [A,B]
const newObject = C;
cloneArray.splice(1,1,newObject);
// ^ cloneArray = [A,C]
现在,如果您要更改 A
的内容:
array[0].foo = 'Bar';
// Or
cloneArray[0].foo = 'Bar';
然后您会在源数组和克隆中看到更改。