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

如何基于数组长度重复对象并赋值?Angular 2+/JavaScript

解决重复对象时的引用共享问题

你当前的代码遇到了一个典型的引用类型陷阱——用Array.fill(this.add[0])填充数组时,数组里的每一项其实都是同一个对象的引用。这就意味着,当你修改其中一个对象的value属性时,所有对象的value都会跟着改变,因为它们指向的是内存里的同一个对象。

正确的实现方案

我们需要为数组的每个位置创建独立的对象实例,而不是复用同一个引用。这里有两种简单可靠的方式:

方式一:利用Array.from()生成独立对象

Array.from()允许我们在创建数组的同时,为每个元素生成新的对象副本:

const add = [{ type: 'Package', value: '' }];
const packages = this.form.value.packages;

// 基于packages数组的长度,为每个索引创建新对象
const packageDup = Array.from({ length: packages.length }, (_, i) => ({
  ...add[0], // 浅拷贝原对象的所有属性
  value: packages[i] // 赋值对应索引的packages元素
}));

方式二:直接用map()遍历packages数组

既然我们已经有了packages数组,直接遍历它来生成目标对象会更直观:

const add = [{ type: 'Package', value: '' }];
const packages = this.form.value.packages;

const packageDup = packages.map(pkgItem => ({
  ...add[0],
  value: pkgItem // 直接将当前packages元素作为value
}));

原代码问题的根源

Array.fill()方法对于引用类型(比如对象),只会把同一个引用地址填充到数组的所有位置。也就是说,packageDup里的每一项都是add[0]的“别名”,它们共享同一块内存空间,所以修改任意一项的属性都会影响所有项。

而上面两种方法中,我们通过对象展开运算符...对原对象进行了浅拷贝,确保每个数组元素都是独立的新对象,修改其中一个不会影响其他项。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:10:47