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
相关产品推荐
相关产品推荐

