如何将对象中的子对象存入数组?循环存值仅留最后一项的问题
问题分析与解决方案
常见原因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
相关产品推荐
相关产品推荐

