You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

TypeScript/JavaScript删除数组对象属性时原数组被修改问题排查

为什么修改克隆后的数组会影响原数组?

这其实是JavaScript引用类型的机制问题,不是语法错误,咱们一步一步拆解清楚:

首先看你代码的第一步:

let exportData = this.firstList;

这行代码没有真正克隆数组,它只是把原数组firstList的内存引用赋值给了exportData。你可以理解成两个变量共享同一个“数据盒子”——不管通过哪个变量修改盒子里的内容,另一个变量都会同步看到变化,数组里的每个对象也是同样的引用逻辑。

接下来你用filter遍历数组并删除job属性:

exportData = exportData.filter(function (props) { 
  delete props.job; 
  return true; 
});

这里的props其实就是原数组firstList里的对象本身,你删除props.job本质上是在修改原数组里的对象,所以原数组的对应属性自然也会消失。另外多说一句,filter的设计目的是筛选数组元素(返回true保留,false剔除),用来遍历修改元素有点“误用”,用map会更贴合场景。

正确的做法:切断引用,克隆数组内的对象

要避免影响原数组,你需要同时克隆数组和数组里的每个对象,彻底切断引用关系。这里有两种常用的实现方式:

方式1:使用对象展开运算符(ES6+)

let exportData = this.firstList.map(item => {
  // 展开原对象的所有属性,排除job,返回全新的对象
  const { job, ...rest } = item;
  return rest;
});

方式2:使用Object.assign

let exportData = this.firstList.map(item => {
  // 创建原对象的副本
  const newItem = Object.assign({}, item);
  // 在副本上删除job属性
  delete newItem.job;
  return newItem;
});

这两种方式都会生成一个全新的数组,数组里的每个对象也是原对象的独立副本,修改exportData里的内容就不会再影响到firstList了。

内容的提问来源于stack exchange,提问作者jimbo R

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:44:51