如何将带parentId的扁平化数组完整转换为多维树形数组?
实现扁平化数组的全层级多维转换
直接上可运行的代码,能处理任意深度的层级转换:
const flatArray = [ { id: 'cG9zdDoyODI=', parentId: null, children: [] }, { id: 'cG9zdDoyODM=', parentId: null, children: [] }, { id: 'cG9zdDoyODc=', parentId: null, children: [] }, { id: 'cG9zdDoyODY=', parentId: 'cG9zdDoyODc=', children: [] }, { id: 'cG9zdDozMDE=', parentId: 'cG9zdDoyODY=', children: [] }, { id: 'cG9zdDozMDI=', parentId: 'cG9zdDozMDE=', children: [] }, { id: 'cG9zdDoyODQ=', parentId: 'cG9zdDoyODc=', children: [] }, { id: 'cG9zdDoyODU=', parentId: 'cG9zdDoyODc=', children: [] } ]; function buildHierarchy(flatData) { // 用Map存储每个节点,方便快速查找父节点 const nodeMap = new Map(); const rootNodes = []; // 第一步:把所有节点存入Map flatData.forEach(node => { nodeMap.set(node.id, node); }); // 第二步:遍历节点,将子节点挂载到对应父节点的children数组 flatData.forEach(node => { if (node.parentId !== null) { const parentNode = nodeMap.get(node.parentId); if (parentNode) { parentNode.children.push(node); } } else { // parentId为null的是根节点,直接收集 rootNodes.push(node); } }); return rootNodes; } // 调用函数得到结果 const hierarchicalArray = buildHierarchy(flatArray); console.log(hierarchicalArray);
代码说明
- 用
Map存储节点是为了O(1)时间复杂度查找父节点,比嵌套循环效率高很多,尤其是数据量大的时候。 - 两次遍历数组:第一次构建节点映射表,第二次完成层级挂载。
- 自动处理任意深度的嵌套,不管是3层还是更多层都能正确转换。
运行后,所有带parentId的节点都会被放到对应父节点的children数组里,得到完全符合需求的多维数组。
内容的提问来源于stack exchange,提问作者eaonflux
相关产品推荐
相关产品推荐

