list生成树形结构子节点对应多个不同的父节点,重复子节点只生成一次 js
时间: 2024-09-06 13:07:41 浏览: 33
使用递归删除树形结构的所有子节点(java和mysql实现)
在JavaScript中,如果你有一个列表,并且需要将这些列表项组织成树形结构,其中子节点可能对应多个父节点,同时还要确保重复的子节点只生成一次,你可以通过编写一个函数来实现这一需求。
以下是一个简单的例子,展示了如何将扁平的列表转换成具有多父节点的树形结构,并且确保子节点只生成一次:
```javascript
function buildTree(list) {
const map = new Map(); // 用于存储节点,避免重复创建
const roots = []; // 存储没有父节点的根节点
// 遍历列表,创建节点并建立父子关系
list.forEach(item => {
if (!map.has(item.id)) {
const node = { id: item.id, children: [] };
map.set(item.id, node); // 将节点存储在map中
if (item.parentId === null) {
// 没有父节点的项作为根节点
roots.push(node);
}
}
// 如果当前项有父节点,建立父子关系
if (item.parentId !== null && map.has(item.parentId)) {
const parentNode = map.get(item.parentId);
parentNode.children.push(map.get(item.id));
}
});
return roots; // 返回树形结构的根节点数组
}
// 示例列表数据
const listData = [
{ id: 1, parentId: null }, // 根节点
{ id: 2, parentId: 1 }, // 子节点1
{ id: 3, parentId: 1 }, // 子节点2
{ id: 4, parentId: 2 }, // 子节点1的子节点
{ id: 5, parentId: 3 }, // 子节点2的子节点
{ id: 2, parentId: 3 } // 子节点2的重复项
];
// 构建树形结构
const tree = buildTree(listData);
console.log(tree);
```
在这个例子中,我们首先定义了一个`buildTree`函数,它接收一个列表作为参数。我们使用一个Map来存储已经创建的节点,这样可以避免重复创建节点,并且快速查找节点。我们还定义了一个数组来存储根节点。通过遍历列表,我们为每个项创建一个节点,并将其添加到Map中。如果项没有父节点,我们将其添加到根节点数组中。如果项有父节点,我们将其子节点引用添加到父节点的`children`数组中。最后,我们返回根节点数组。
阅读全文