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

JavaScript:对象数组多对象值批量更新的问题及解决方案

对象数组批量赋值失败的问题与解决方法

错误实现及问题现象

最初尝试通过嵌套循环修改对象数组的属性值,代码如下:

// for..of loop with variable i to access second array to get values

const AntraegeListe = new Array();
for (let i = 0; i < MESRForm.MitarbeiterListe.length; i++) {
  AntraegeListe.push(obj);
}
for (var i = 0; i < MESRForm.MitarbeiterListe.length; i++) {
  for (const _antrag of AntraegeListe) {
    _antrag.Mitarbeiter = MESRForm.MitarbeiterListe[i].Mitarbeiter;
    _antrag.UserIDMitarbeiter =
      MESRForm.MitarbeiterListe[i].UserIDMitarbeiter;
    _antrag.Vorgesetzter = MESRForm.MitarbeiterListe[i].Vorgesetzter;

    console.log(_antrag);
    break;
  }
}

console.log(AntraegeListe);

执行后发现:控制台打印单个对象时属性值已更新,但整个AntraegeListe数组的所有元素属性值完全一致,无法生成包含3个对应MitarbeiterListe数组值的对象数组。

问题根源

对象属于引用类型,最初的代码中,循环推入数组的是同一个obj对象的内存引用。数组里的所有元素实际上指向同一个对象,后续修改属性时,所有数组元素都会同步变化,最终所有元素的属性值都会被最后一次迭代的赋值覆盖。

正确实现方案

将对象声明放入循环内部,每次迭代创建新对象并赋值后推入数组,代码如下:

createMESR(MESRForm: any): void {
  const AntraegeListe = new Array();
  for (var i = 0; i < MESRForm.MitarbeiterListe.length; i++) {
    var obj = {....};

    obj.AntragID = '';
    obj.Timestamp = '';
    obj.Antragsteller = MESRForm.Antragsteller;
    obj.Mitarbeiter = MESRForm.MitarbeiterListe[i].Mitarbeiter;
    // 其他属性赋值...

    AntraegeListe.push(obj);
  }

  console.log(AntraegeListe);
}

解决原理

每次循环迭代时创建新的对象实例,每个对象拥有独立的内存地址。将这些独立对象推入数组后,各自保存对应MitarbeiterListe元素的属性值,最终数组会生成对应数量的独立对象,属性值与目标数组元素一一匹配。

内容的提问来源于stack exchange,提问作者K.VYN

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 11:35:20