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

JavaScript数组推入对象时元素被覆盖问题排查求助

数组元素被重复覆盖的问题排查与解决

问题原因

你在循环外部只声明了一个tempObj对象,后续所有属性修改都是在这个同一个对象上进行的。每次将tempObj推入Data数组时,实际上是把这个对象的内存引用添加到数组中——数组里的所有元素指向的都是内存中的同一个对象。当后续循环修改tempObj的属性时,数组里所有之前的元素也会跟着变化,最终全部显示为最后一次修改后的结果。

解决方案

核心思路是:每次生成一组完整的键值对后,将新对象推入数组,而不是重复使用同一个对象的引用。下面提供两种可行方案:

方案1:复制对象后推入数组,重置临时对象

在每次完成一组属性赋值时,复制当前tempObj的内容到新对象,再推入数组,随后重置tempObj为空对象:

let header = [];

for (let index = 0; index < 4; index++) {
  header.push(`header${index}`);
}

let datacell = [];

for (let index = 0; index < 64; index++) {
  datacell.push(`datacell${index}`);
}

let Data = [];

let tempObj = {};

for (let j = 0; j < datacell.length; j++) {
  for (let k = 0; k < header.length; k++) {
    if (j % header.length === k) {
      tempObj[header[k]] = datacell[j];
      if (k === header.length - 1) {
        // 复制当前对象的所有属性到新对象
        Data.push({...tempObj});
        // 重置临时对象,准备下一组数据
        tempObj = {};
      }
    }
  }
}
console.log(Data);

方案2:重构循环逻辑,每次创建新临时对象

直接按header的长度分组遍历datacell,每组数据创建一个新的tempObj,逻辑更简洁直观:

let header = [];

for (let index = 0; index < 4; index++) {
  header.push(`header${index}`);
}

let datacell = [];

for (let index = 0; index < 64; index++) {
  datacell.push(`datacell${index}`);
}

let Data = [];

// 按header长度分组遍历datacell
for (let j = 0; j < datacell.length; j += header.length) {
  let tempObj = {};
  for (let k = 0; k < header.length; k++) {
    tempObj[header[k]] = datacell[j + k];
  }
  Data.push(tempObj);
}
console.log(Data);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 12:43:18