如何将嵌套对象/对象数组转换为单一对象数组?
解决方案
要实现递归提取嵌套结构中的所有对象,核心是遍历每一层的数组和对象,区分数组与普通对象(因为typeof [] === 'object'),并递归处理嵌套内容。以下提供两种贴合需求的实现:
1. 提取所有普通对象(非数组、非null)
此方案会收集所有层级的普通对象,包括作为容器的非空对象:
function extractAllObjects(value) { const result = []; // 处理数组:遍历每个元素递归提取 if (Array.isArray(value)) { value.forEach(item => { result.push(...extractAllObjects(item)); }); } // 处理普通对象:先加入结果,再遍历属性递归 else if (typeof value === 'object' && value !== null) { result.push(value); Object.values(value).forEach(val => { result.push(...extractAllObjects(val)); }); } return result; } // 测试示例输入 const input = [ { array1: [{}, {}, {}, [{}]], object1: {}, object2: { object1: {}, object2: { object1: {} } } } ]; const allObjects = extractAllObjects(input); console.log(allObjects);
2. 提取所有空对象(匹配你的示例输出)
如果只需要收集没有自身可枚举属性的空对象(即Object.keys(obj).length === 0),可以修改逻辑:
function extractEmptyObjects(value) { const result = []; if (Array.isArray(value)) { value.forEach(item => { result.push(...extractEmptyObjects(item)); }); } else if (typeof value === 'object' && value !== null) { // 仅收集空对象 if (Object.keys(value).length === 0) { result.push(value); } // 继续递归遍历属性值 Object.values(value).forEach(val => { result.push(...extractEmptyObjects(val)); }); } return result; } // 测试示例输入,结果与你的期望输出一致 const emptyObjects = extractEmptyObjects(input); console.log(emptyObjects);
逻辑说明
- 递归遍历:遇到数组就遍历每个元素,遇到普通对象则根据需求决定是否收集,再遍历对象的所有属性值继续递归。
- 类型区分:通过
Array.isArray()判断数组,避免把数组误判为普通对象。 - 空对象判断:用
Object.keys(obj).length === 0筛选空对象,贴合你给出的示例输出。
内容的提问来源于stack exchange,提问作者coding_spice
相关产品推荐
相关产品推荐

