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

如何将带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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 23:12:22