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

如何将嵌套对象/对象数组转换为单一对象数组?

解决方案

要实现递归提取嵌套结构中的所有对象,核心是遍历每一层的数组和对象,区分数组与普通对象(因为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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 14:32:12