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

如何将多维对象数组扁平化处理为一维对象数组?

多维嵌套对象数组扁平化解决方案

你需要的是将嵌套层级中的_id属性逐层合并,最终生成每个底层节点对应一条完整层级id的一维数组。单纯用flatMap()只能展开数组结构,无法完成跨层级的属性合并,这里用递归的方式可以完美解决:

通用递归实现方案

function flattenData(data) {
  const result = [];

  function traverse(node, parentAttrs = {}) {
    // 提取当前节点所有带_id的属性(自动适配parent/child/grand_child等层级)
    const currentAttrs = Object.fromEntries(
      Object.entries(node).filter(([key]) => key.includes('_id'))
    );
    // 合并父级属性与当前节点属性
    const mergedAttrs = {...parentAttrs, ...currentAttrs};

    if (node.child && node.child.length) {
      // 存在子节点,递归遍历子节点并传递已合并的属性
      node.child.forEach(child => traverse(child, mergedAttrs));
    } else {
      // 无嵌套子节点,将合并后的属性对象加入结果数组
      result.push(mergedAttrs);
    }
  }

  // 遍历顶层数组的每个父节点
  data.forEach(item => traverse(item));
  return result;
}

// 测试使用
let data = [
  {
    parent_id: 1,
    name: "parent 1",
    child: [
      {
        child_id: 3,
        name: "child 1",
        child: [
          { grand_child_id: 5, name: "grand child 1" },
          { grand_child_id: 6, name: "grand child 2" },
        ],
      },
    ],
  },
  {
    parent_id: 2,
    name: "parent 2",
    child: [
      {
        child_id: 4,
        name: "child ",
        child: [
          { grand_child_id: 7, name: "grand child 3" },
          { grand_child_id: 8, name: "grand child 4" },
        ],
      },
    ],
  },
];

const result = flattenData(data);
console.log(result);

结合flatMap的简化写法

如果偏好链式调用风格,也可以用flatMap结合递归实现:

function flattenNode(node, parentAttrs = {}) {
  const currentAttrs = Object.fromEntries(
    Object.entries(node).filter(([key]) => key.includes('_id'))
  );
  const mergedAttrs = {...parentAttrs, ...currentAttrs};

  return node.child?.length 
    ? node.child.flatMap(child => flattenNode(child, mergedAttrs))
    : [mergedAttrs];
}

const result = data.flatMap(item => flattenNode(item));

关键逻辑说明

  1. 属性提取与合并:通过过滤_id结尾的属性,自动适配不同层级的id字段,避免硬编码层级名称;
  2. 递归遍历:每一层节点都会将已合并的上层属性传递给子节点,确保底层节点能收集到完整的层级id;
  3. 终止条件:当节点没有child数组时,说明到达最底层,将合并后的对象加入结果数组。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 15:40:25