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

JavaScript循环生成对象数组时所有索引数据相同的问题求助

问题原因与解决方案

核心问题:对象的引用特性

JavaScript里的对象属于引用类型,变量存储的不是对象本身,而是指向对象内存地址的引用。你代码里的所有操作,都是在修改同一个对象:

  • let temp = test_data; 让temp和test_data指向内存中同一个对象
  • 循环里修改temp.value/temp.value2,本质是在修改这个共享对象的属性
  • test_array.push(test_data)和test_array[i] = temp,都是把同一个对象的引用添加到数组里

所以最终数组里的所有元素,其实都是指向同一个对象的指针,自然显示的内容完全一致。

修正方案:每次循环创建新对象

要解决这个问题,必须保证每次添加到数组的是新的对象实例,每个实例拥有独立的内存空间。以下是几种可行的写法:

1. 直接创建新对象字面量(最简洁)

const number = 10;
let test_array = [];

for (let i = 0; i < number; i++) {
  const value = 500 * (i + 1);
  // 每次循环生成全新的对象
  const temp = {
    value: value,
    value2: value * 100
  };
  test_array.push(temp);
  
  console.log(temp);
  console.log(test_array[i]);
  console.log(test_array);
}

console.log(test_array);

2. 基于原始对象复制新实例

如果需要复用test_data的结构,可以用Object.assign或展开运算符复制出全新对象:

const test_data = {
  value: 0,
  value2: 0
};

const number = 10;
let test_array = [];

for (let i = 0; i < number; i++) {
  // 复制test_data生成新对象(两种写法二选一)
  // const temp = Object.assign({}, test_data);
  const temp = {...test_data};
  
  temp.value = 500 * (i + 1);
  temp.value2 = temp.value * 100;
  test_array.push(temp);
  
  console.log(temp);
  console.log(test_array[i]);
  console.log(test_array);
}

console.log(test_array);

补充说明

你之前尝试的test_array[i].value = ***写法无效,是因为test_array[i]指向的依然是那个共享对象,修改的还是同一个实例。只有让数组的每个元素都指向独立的对象,才能实现预期的动态生成效果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 09:27:30