可使用展开运算符配合数组解构在指定索引插入浅拷贝对象,核心是“拆分原数组+插入新项+合并”,展开运算符不修改原数组且仅浅拷贝一层。

可以使用展开运算符(...)配合数组解构,在指定索引位置插入浅拷贝对象,核心是“拆分原数组 + 插入新项 + 合并”。注意:展开运算符本身不修改原数组,且只做一层浅拷贝。
在指定索引前插入(如第 i 位)
将原数组按索引 i 拆成两段,中间插入浅拷贝后的对象:
const arr = [{id: 1}, {id: 2}, {id: 3}];
const obj = {id: 99, name: 'new'};
const i = 1; // 插入到索引 1 的位置(即原第二项之前)
const newArr = [
...arr.slice(0, i), // [ {id: 1} ]
{...obj}, // 浅拷贝对象
...arr.slice(i) // [ {id: 2}, {id: 3} ]
];
// 结果:[{id: 1}, {id: 99, name: 'new'}, {id: 2}, {id: 3}]
在指定索引后插入(如第 i 位之后)
等价于在索引 i + 1 处插入,逻辑一致,只需调整切片位置:
-
slice(0, i + 1)取前 i+1 个元素 - 插入浅拷贝对象
-
slice(i + 1)取剩余部分
例如在索引 1 之后插入(即插在 {id: 2} 后面):
const newArr = [
...arr.slice(0, 2), // [{id: 1}, {id: 2}]
{...obj},
...arr.slice(2) // [{id: 3}]
];
插入多个浅拷贝对象
直接展开多个对象字面量,或映射原对象数组进行浅拷贝:
- 插入两个新对象:
{...a}, {...b} - 批量浅拷贝并插入:
...originalObjs.map(o => ({...o}))
示例:
const toInsert = [{id: 98}, {id: 99}];
const newArr = [
...arr.slice(0, 1),
...toInsert.map(item => ({...item})), // 每个都浅拷贝
...arr.slice(1)
];
注意事项与限制
浅拷贝仅复制第一层属性,嵌套对象仍共享引用:
-
{...{a: {b: 1}}}中的a对象未被深拷贝 - 若需深拷贝,需用
structuredClone()(现代环境)或第三方库 - 展开运算符无法直接用于稀疏数组或类数组对象,需先转为真数组(如
Array.from())











