js在一组一维数组中,通过id查找父节点,组成新的树结构,没找到父节点的自己做父节点
时间: 2024-03-07 21:50:51 浏览: 220
好的,这是一个比较常见的树形结构处理问题,以下是一种可能的实现方式:
```javascript
function buildTree(data) {
const idMap = new Map(); // 用 Map 存储节点 id 和对应的节点对象
const rootNodes = []; // 存储根节点
// 第一次遍历,将每个节点存入 Map 中
for (const node of data) {
node.children = []; // 初始化子节点数组
idMap.set(node.id, node); // 存储节点对象
}
// 第二次遍历,构建树形结构
for (const node of data) {
const parentId = node.parentId;
if (parentId === null || !idMap.has(parentId)) {
// 没有父节点或父节点未出现在数据中,将其作为根节点
rootNodes.push(node);
} else {
// 找到父节点,将当前节点作为子节点添加到父节点下
const parent = idMap.get(parentId);
parent.children.push(node);
}
}
return rootNodes;
}
```
这个函数接受一个一维数组 `data`,每个元素都应该包含 `id` 和 `parentId` 两个属性,表示节点的唯一标识和父节点的唯一标识。如果一个节点没有父节点,其 `parentId` 应该为 `null`。
函数首先创建一个 `Map` 对象 `idMap`,用于存储节点 id 和对应的节点对象。然后遍历一遍原始数据,将每个节点存入 `idMap` 中,并初始化每个节点的 `children` 属性为空数组。
第二次遍历原始数据,构建树形结构。如果当前节点没有父节点或父节点未出现在数据中,将其作为根节点添加到 `rootNodes` 数组中。否则,找到父节点,将当前节点作为其子节点添加到 `children` 数组中。最后返回 `rootNodes` 数组即可。
注意,这个函数的实现方式可能不是最优的,具体实现方式可以根据具体需求和数据结构来选择。
阅读全文