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

在for循环中更新对象嵌套属性时,生成的对象id全部相同的问题求助

问题分析与解决方法

你遇到的问题核心是浅拷贝导致的引用共享:
你用{...baseObj}做的是浅拷贝,只会复制baseObj的第一层属性,但里面的nestedId是个嵌套对象,拷贝后所有newObj的nestedId都指向同一个内存地址的对象。所以每次循环修改id,都是在修改同一个嵌套对象,最后所有数组元素的id都会是循环最后一次赋值的3。

解决方法1:手动深拷贝嵌套层级

在拷贝外层对象的同时,也拷贝嵌套的nestedId对象,切断引用:

const baseObj = {
    nestedId: {
      id: 1,
  }
}

const objArr = [];
for(let i=0; i<3; i++) {
    // 同时复制外层和嵌套的nestedId
    const newObj = {...baseObj, nestedId: {...baseObj.nestedId}}
    newObj.nestedId.id = i + 1;
    objArr.push(newObj)
}

解决方法2:直接在循环内创建新对象

如果baseObj的结构不复杂,也可以直接在循环里生成全新的对象,彻底避免引用问题:

const objArr = [];
for(let i=0; i<3; i++) {
    const newObj = {
        nestedId: {
            id: i + 1
        }
    }
    objArr.push(newObj)
}

补充:深层嵌套场景的通用深拷贝

如果你的对象嵌套层级更多,可以用JSON.parse(JSON.stringify(baseObj))做通用深拷贝,但要注意这种方法不能处理函数、Symbol、循环引用等特殊类型,你的场景里用前两种方法就足够了:

const newObj = JSON.parse(JSON.stringify(baseObj));

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 20:20:05