求助:如何按指定步骤将普通JSON转换为JSON树形结构?
解决JSON扁平结构转树形结构的问题
我来帮你搞定这个转换需求,按照你描述的规则——以pid:0的节点为根,递归查找对应_id作为pid的子节点,这里有一个高效的JavaScript实现方案:
实现思路
- 构建节点映射表:先把所有扁平节点存入一个以
_id为键的对象,这样可以O(1)时间快速找到任意节点,避免反复遍历数组浪费性能。 - 递归关联父子节点:遍历原始数据,将根节点(
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
相关产品推荐
相关产品推荐

