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

JavaScript如何将带父子关联的平级数组转换为嵌套树形结构

实现方案

原代码问题说明

你编写的递归函数存在两个核心问题导致无法实现需求:

  • 传入递归的i.childs是子节点ID数组,不是节点对象数组,无法直接处理属性
  • 遍历过程中没有对结果进行组装存储,没有生成新的嵌套结构

思路说明

  • 先构建ID到节点的映射表,避免重复遍历数组查找子节点
  • 递归处理每个节点,将原始的子节点ID数组转换为嵌套的节点对象数组
  • 空的childs字段统一处理为空数组,避免长度判断报错
    注意:你给出的目标结构示例存在语法错误,同一个对象内重复定义name属性,修正后的合理结构是节点2和4为1的childs数组下的平级节点

完整实现代码

function buildTree(main_childs) {
    // 1. 构建id到节点的映射
    const nodeMap = {};
    main_childs.forEach(node => {
        nodeMap[node.child_name] = node;
    });

    // 2. 递归生成嵌套节点
    const formatNode = (id) => {
        const rawNode = nodeMap[id];
        const childIds = Array.isArray(rawNode.childs) ? rawNode.childs : [];
        return {
            name: id,
            childs: childIds.map(childId => formatNode(childId))
        }
    }

    // 3. 自动查找根节点(没有被其他节点作为子节点的节点,也可直接指定根ID为1)
    const allChildIds = new Set();
    main_childs.forEach(node => {
        if (Array.isArray(node.childs)) {
            node.childs.forEach(id => allChildIds.add(id));
        }
    });
    const rootIds = main_childs.map(node => node.child_name).filter(id => !allChildIds.has(id));

    // 4. 组装成要求的输出结构
    return rootIds.map(rootId => {
        return {
            [rootId]: formatNode(rootId)
        }
    });
}

// 测试运行
var main_childs = [
    {child_name: 1, childs:[2,4]},
    {child_name: 2, childs:[3]},
    {child_name: 3, childs:""},
    {child_name: 4, childs:""}
]
const final_childs = buildTree(main_childs);
console.log(JSON.stringify(final_childs, null, 2));

输出结果

运行代码后得到的结构完全符合嵌套需求:

[
  {
    "1": {
      "name": 1,
      "childs": [
        {
          "name": 2,
          "childs": [
            {
              "name": 3,
              "childs": []
            }
          ]
        },
        {
          "name": 4,
          "childs": []
        }
      ]
    }
  }
]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 14:51:01