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
相关产品推荐
相关产品推荐

