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

循环向数组推入对象仅保留最后值的问题求助及解决建议

解决数组只保留最后一个对象的问题

嘿,我太懂你遇到的这个坑啦!这是JavaScript里引用类型常踩的小陷阱,咱们来快速搞定它~

问题根源

你把myObj的声明放在了for循环外面,而对象属于引用类型——也就是说,整个循环里你其实一直在修改同一个对象的属性,然后把这个对象的"引用"(相当于指针)push到data数组里。循环结束后,数组里所有元素指向的都是同一个对象,自然就全显示最后一次修改的内容啦!

两种解决方案

方案1:把对象声明移到循环内部

每次循环都创建一个全新的对象,这样每次push到数组里的都是独立的对象引用:

var data = [];
for (var kl = 0; kl < reportCriteriaIdData.length; kl++) {
  var myObj = {}; // 移到循环内,每次新建对象
  myObj["id"] = [myId];
  myObj[thisobj.scFilterLabel[0]] = [reportCriteriaIdData[kl].text];
  myObj["label"] = [reportCriteriaIdData[kl].text];
  myObj["index"] = [kl];
  data.push(myObj);
}

方案2:push时复制新对象

如果不想调整myObj的声明位置,可以在push的时候用扩展运算符或者Object.assign复制一个新对象进去:

var myObj = {};
var data = [];
for (var kl = 0; kl < reportCriteriaIdData.length; kl++) {
  myObj["id"] = [myId];
  myObj[thisobj.scFilterLabel[0]] = [reportCriteriaIdData[kl].text];
  myObj["label"] = [reportCriteriaIdData[kl].text];
  myObj["index"] = [kl];
  data.push({...myObj}); // 扩展运算符复制新对象
  // 也可以用 Object.assign:data.push(Object.assign({}, myObj));
}

这样调整后,data数组里的每个元素都会对应循环中当前次的属性值,不会再全部变成最后一个对象啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:11:37