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

求助:如何按指定步骤将普通JSON转换为JSON树形结构?

解决JSON扁平结构转树形结构的问题

我来帮你搞定这个转换需求,按照你描述的规则——以pid:0的节点为根,递归查找对应_id作为pid的子节点,这里有一个高效的JavaScript实现方案:

实现思路

  1. 构建节点映射表:先把所有扁平节点存入一个以_id为键的对象,这样可以O(1)时间快速找到任意节点,避免反复遍历数组浪费性能。
  2. 递归关联父子节点:遍历原始数据,将根节点(pid=0)直接加入树形数组;其他节点找到对应的父节点,添加到父节点的children数组中,自动完成递归关联。

代码示例

假设你的扁平JSON数据存储在flatData变量中,代码如下:

// 1. 创建节点映射表,同时初始化每个节点的children数组
const nodeMap = {};
flatData.forEach(node => {
  nodeMap[node._id] = { ...node, children: [] };
});

// 2. 构建树形结构
const treeStructure = [];
flatData.forEach(node => {
  const currentNode = nodeMap[node._id];
  if (node.pid === 0) {
    // 根节点直接加入树形数组
    treeStructure.push(currentNode);
  } else {
    // 找到父节点并添加为子节点
    const parentNode = nodeMap[node.pid];
    if (parentNode) {
      parentNode.children.push(currentNode);
    }
  }
});

// 输出转换后的树形结构
console.log(treeStructure);

代码说明

  • 这个方法的时间复杂度是O(n),只需要两次遍历数组,处理大数据量时性能优势明显。
  • 完全符合你的规则:会自动找到_id='5a016637e986c90418e96ee9'(pid=0)作为根节点,然后把pid等于该_id的节点(比如_id='5a0d852ce986c9041df2aafb')加入它的children,再递归处理这些子节点的子节点。
  • 每个节点都会被正确关联,不会遗漏层级关系。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 09:26:45