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

TypeScript循环中执行push操作始终追加最后修改的对象问题

问题原因
  • JS/TS中对象属于引用类型,变量存储的是对象在内存中的地址,而非对象本身的副本
  • 代码里仅在外层for循环中创建了一次myObject对象,内层循环全程复用同一个引用修改DocID属性
  • idMapping.push(myObject)实际是把同一个内存地址追加到数组中,所有数组元素指向同一个对象,最终所有元素都会同步为最后一次修改的属性值
解决方案

方案1:将对象创建逻辑移到内层循环(最推荐)

每次循环都生成全新的对象,从根源避免引用复用:

let data: any = JSON.parse('{"messages":[{"id":"1234"},{"id":"2345"},{"id":"3456"}]}');
let idMapping: any[] = [];
for(let index = 0; index < 1; index++) {
    for (let val of data.messages) {
        // 每次迭代创建独立对象
        const myObject = {
            DocID: val.id,
            index: index
        };
        idMapping.push(myObject);
    }
}
console.log(idMapping);

方案2:push时创建对象副本

如果需要保留原有外层初始化对象的逻辑,可以在push时通过扩展运算符创建新对象再追加:

let data: any = JSON.parse('{"messages":[{"id":"1234"},{"id":"2345"},{"id":"3456"}]}');
let myObject:any;
let idMapping: any[] = [];
for(let index = 0; index < 1; index++) {
    myObject = {DocID: "", index: index};
    for (let val of data.messages) {
        myObject.DocID = val.id;
        // 扩展运算符生成新对象再push
        idMapping.push({...myObject});
    }
}
console.log(idMapping);

两种方案运行后都会得到预期结果:

[ { DocID: '1234', index: 0 }, { DocID: '2345', index: 0 }, { DocID: '3456', index: 0 } ]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 19:45:02