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

如何遍历嵌套对象数组生成含层级与父ID的对象数组?

解决方案:嵌套树形结构转扁平层级数组

非递归实现(推荐,避免递归复杂度)

用栈模拟递归过程,逐层处理每个节点,无需担心递归深度限制:

function flattenTree(treeData) {
  const result = [];
  // 栈元素格式:{ node: 节点对象, parentId: 父节点name, level: 当前层级 }
  const stack = [];

  // 初始化顶层节点
  treeData.forEach(node => {
    stack.push({ node, parentId: null, level: 0 });
  });

  while (stack.length > 0) {
    const { node, parentId, level } = stack.pop();
    // 生成目标对象
    const item = {
      id: node.name,
      label: node.name,
      level
    };
    // 非顶层节点添加parentId
    if (parentId !== null) {
      item.parentId = parentId;
    }
    result.push(item);

    // 反向遍历children,保证处理顺序和原结构一致(栈是后进先出)
    for (let i = node.children.length - 1; i >= 0; i--) {
      stack.push({
        node: node.children[i],
        parentId: node.name,
        level: level + 1
      });
    }
  }

  return result;
}

// 测试数据
const input = {
  "count": 3,
  "tree": [
    {
      "name": "Parent1a",
      "children": [
        {
          "name": "Child1a",
          "children": [
            {
              "name": "Child2a",
              "children": [
                {
                  "name": "Child3a",
                  "children": [
                    {
                      "name": "Child4a",
                      "children": []
                    }
                  ]
                }
              ]
            }
          ]
        }
      ]
    },
    {
      "name": "Parent1b",
      "children": [
        {
          "name": "Child1b",
          "children": []
        }
      ]
    }
  ]
};

// 调用函数
const output = flattenTree(input.tree);
console.log(output);

递归实现(简洁但需注意层级深度)

如果能理解基础递归逻辑,这个写法更简洁:

function flattenTreeRecursive(treeData, parentId = null, level = 0) {
  let result = [];
  treeData.forEach(node => {
    // 生成当前节点
    const item = {
      id: node.name,
      label: node.name,
      level
    };
    if (parentId !== null) {
      item.parentId = parentId;
    }
    result.push(item);
    // 递归处理子节点
    if (node.children.length > 0) {
      result = result.concat(flattenTreeRecursive(node.children, node.name, level + 1));
    }
  });
  return result;
}

// 调用方式
const outputRecursive = flattenTreeRecursive(input.tree);
console.log(outputRecursive);

关键说明

  • 非递归版本用栈存储待处理节点,每个节点处理时生成目标对象,再将子节点推入栈,完全模拟递归的遍历顺序
  • 递归版本通过函数自身调用处理子节点,代码更短,但如果树形结构层级极深(比如超过1000层),可能触发栈溢出
  • 两种实现都会生成你需要的结构:顶层节点level=0无parentId,子节点level逐层递增,parentId对应父节点的name

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 00:58:22