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

如何将对象中的子对象存入数组?循环存值仅留最后一项的问题

问题分析与解决方案

常见原因1:数组在循环内部声明

你推测的情况确实是高频问题——如果把数组的创建语句(比如const arr = [])放在for循环的内部,每次迭代都会新建一个空数组,之前push的内容会被完全覆盖,最终只剩最后一次循环的结果。

解决办法:把数组声明移到循环外面,确保整个循环共用同一个数组:

// 正确:数组在循环外初始化
const resultArr = [];
const parentObj = { /* 你的包含子对象的父对象 */ };

// 遍历父对象的子对象(排除原型链属性)
for (const key in parentObj) {
  if (parentObj.hasOwnProperty(key)) {
    resultArr.push(parentObj[key]);
  }
}

console.log(resultArr); // 现在会包含所有子对象

常见原因2:每次push的是同一个对象引用

如果数组是在循环外声明的,但还是只剩最后一个对象,大概率是你在循环里重复修改同一个对象实例,然后push它的引用。因为数组存储的是对象引用,所有位置指向的都是同一个对象,最后一次修改会覆盖所有条目。

错误示例:

const resultArr = [];
const tempObj = {}; // 仅创建一次的临时对象
const parentObj = { a: { name: 'A' }, b: { name: 'B' }, c: { name: 'C' } };

for (const key in parentObj) {
  tempObj.name = parentObj[key].name; // 每次修改同一个tempObj
  resultArr.push(tempObj); // 多次push同一个引用
}

console.log(resultArr); // 所有元素都是{name: 'C'}

解决办法:每次循环创建新的对象实例,或直接push原父对象的子对象(无需修改时):

// 方法1:循环内新建对象并拷贝属性
const resultArr = [];
const parentObj = { a: { name: 'A' }, b: { name: 'B' }, c: { name: 'C' } };

for (const key in parentObj) {
  if (parentObj.hasOwnProperty(key)) {
    const newObj = { ...parentObj[key] };
    resultArr.push(newObj);
  }
}

// 方法2:直接push原父对象的子对象(无需修改时)
const resultArr = [];
for (const key in parentObj) {
  if (parentObj.hasOwnProperty(key)) {
    resultArr.push(parentObj[key]);
  }
}

更简洁的ES6+写法(替代for循环)

如果环境支持ES6+,可以用内置方法直接提取子对象到数组:

  • 提取所有直接属性值:Object.values(parentObj)
  • 过滤原型链属性后提取:Object.entries(parentObj).filter(([k]) => parentObj.hasOwnProperty(k)).map(([k, v]) => v)

示例:

const parentObj = { a: { x: 1 }, b: { x: 2 }, c: { x: 3 } };
const resultArr = Object.values(parentObj);
console.log(resultArr); // [{x:1}, {x:2}, {x:3}]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 10:37:40