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

遍历数组复制修改项至新数组仅返回最后修改项重复值问题

问题根源:对象引用的"陷阱"

你遇到的是JavaScript里非常经典的引用类型赋值问题!weekArray里的每个元素都是对象,而对象在JS里是按引用传递的——你在循环中直接修改item的属性,其实是在修改原对象本身;每次把itempush到数组里,也只是把同一个对象的引用存了进去。循环三次后,所有引用指向的都是最后一次修改后的对象,所以最终availabilityArray里全是重复的最后一组内容。

修复方案:创建对象副本,避免共享引用

核心思路是:不要直接修改原对象,每次循环都创建原对象的独立副本,修改副本的属性后再存入数组。同时要注意每次循环清空临时数组,避免累积旧内容。

修改后的代码(基础版)

const weekArray = [ this.monday, this.tuesday, this.wednesday, this.thursday, this.friday, this.saturday, this.sunday ];
console.log(weekArray);
const availabilityArray = [];

for (let i = 0; i < 3; i++) {
  // 每次循环重新创建临时数组,避免累积之前的元素
  const newArray = [];
  weekArray.forEach(item => {
    // 用展开运算符创建原对象的浅拷贝,生成独立的新对象
    const newItem = {...item};
    // 基于原对象的属性值计算新值,避免累加错误
    newItem.weekNumber = item.weekNumber + i;
    newItem.date = new Date(Date.parse(item.date) + i * 7 * 8.64e7);
    newArray.push(newItem);
  });
  availabilityArray.push(...newArray);
}
console.log(availabilityArray);

简化版(用map替代forEach)

可以用map方法直接生成修改后的数组,让逻辑更简洁:

const weekArray = [ this.monday, this.tuesday, this.wednesday, this.thursday, this.friday, this.saturday, this.sunday ];
console.log(weekArray);
const availabilityArray = [];

for (let i = 0; i < 3; i++) {
  // map会返回新数组,每个元素都是修改后的新对象
  const modifiedWeek = weekArray.map(item => ({
    ...item,
    weekNumber: item.weekNumber + i,
    date: new Date(Date.parse(item.date) + i * 7 * 8.64e7)
  }));
  availabilityArray.push(...modifiedWeek);
}
console.log(availabilityArray);
关键细节说明
  1. 对象拷贝的重要性:用{...item}或Object.assign({}, item)做浅拷贝,确保每个newItem都是独立的对象,修改它们不会影响原weekArray的元素,也不会让availabilityArray里的元素共享引用。
  2. 基于原始值计算:修改weekNumber和date时,要使用原item的属性值(比如item.weekNumber),而不是修改后的newItem,这样每次循环都是基于原始数据计算,不会出现累加错误。
  3. 临时数组的作用域:把newArray的声明放到for循环内部,每次循环都会生成全新的临时数组,避免把之前循环的元素重复添加到availabilityArray中。

如果你的对象包含嵌套结构(比如item.schedule.time),浅拷贝就不够了,需要用深拷贝(比如structuredClone(item),这是ES2022新增的API,支持大部分数据类型)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 08:40:14