list生成树形结构子节点对应多个父节点,重复子节点只生成一次 js
时间: 2024-09-06 17:07:41 浏览: 150
在JavaScript中,如果你想要将一个列表转换成树形结构,其中每个子节点可能对应多个父节点,并且要求重复的子节点只生成一次,你可以使用递归函数来实现。以下是一个简单的实现方法:
首先,你需要一个数据结构来表示树形结构,每个节点可以包含子节点的数组。然后,你可以编写一个递归函数,该函数接受当前节点和待处理的数据列表,为当前节点添加子节点,并为每个子节点递归地执行相同的操作。
这里是一个示例代码,展示了如何实现这样的转换:
```javascript
function buildTree(data) {
// 创建一个映射,用于快速查找已创建的节点,避免重复
const nodeMap = new Map();
// 创建树的根节点,这里假设data中第一个元素是根节点
const root = { children: [] };
nodeMap.set(data[0].id, root);
// 遍历数据,构建每个节点及子节点的映射
for (const nodeData of data) {
const parentNode = nodeMap.get(nodeData.parentId);
const currentNode = nodeMap.get(nodeData.id) || { ...nodeData, children: [] };
// 如果当前节点已经在映射中,则跳过创建
if (nodeMap.has(nodeData.id)) continue;
// 将当前节点添加到父节点的子节点数组中
if (parentNode) {
parentNode.children.push(currentNode);
} else {
// 如果没有父节点,说明是根节点,已经在开始时创建
}
// 将当前节点加入映射
nodeMap.set(nodeData.id, currentNode);
}
// 返回构建好的树的根节点
return root;
}
// 示例数据
const data = [
{ id: 1, parentId: null, name: 'Root' },
{ id: 2, parentId: 1, name: 'Child1' },
{ id: 3, parentId: 1, name: 'Child2' },
{ id: 4, parentId: 2, name: 'Child1_1' },
{ id: 5, parentId: 3, name: 'Child2_1' },
{ id: 4, parentId: 2, name: 'Child1_1' } // 重复的子节点
];
// 构建树
const tree = buildTree(data);
console.log(tree);
```
在上述代码中,我们首先创建了一个`nodeMap`,它是用来存储已经创建的节点的映射,以确保每个节点只被创建一次。然后,我们遍历数据数组,为每个节点找到合适的父节点,并将其添加到父节点的子节点数组中。最后,我们返回构建好的树形结构的根节点。
阅读全文