Appearance
平铺的节点转树
js
function listToTree(nodes) {
const rootNodes = [];
const nodeMap = {};
// 将节点存储在哈希表中
for (let node of nodes) {
nodeMap[node.id] = { ...node, children: [] };
}
// 构建树结构
for (let node of nodes) {
// 判断当前节点是否有父节点
const parentNode = nodeMap[node.parentId];
// 如果有父节点,直接为该父节点children添加当前节点
if (parentNode) {
parentNode.children.push(nodeMap[node.id]);
} else {
// 没有父节点,直接push
rootNodes.push(nodeMap[node.id]);
}
}
return rootNodes;
}
// 平铺的节点数组示例
const nodes = [
{ id: 1, name: 'Node 1', parentId: null },
{ id: 2, name: 'Node 1.1', parentId: 1 },
{ id: 3, name: 'Node 1.1.1', parentId: 2 },
{ id: 4, name: 'Node 1.2', parentId: 1 },
{ id: 5, name: 'Node 2', parentId: null },
{ id: 6, name: 'Node 2.1', parentId: 5 }
];
// 转换为树状结构
const tree = listToTree(nodes);
console.log(tree);
function listToTree(nodes) {
const rootNodes = [];
const nodeMap = {};
// 将节点存储在哈希表中
for (let node of nodes) {
nodeMap[node.id] = { ...node, children: [] };
}
// 构建树结构
for (let node of nodes) {
// 判断当前节点是否有父节点
const parentNode = nodeMap[node.parentId];
// 如果有父节点,直接为该父节点children添加当前节点
if (parentNode) {
parentNode.children.push(nodeMap[node.id]);
} else {
// 没有父节点,直接push
rootNodes.push(nodeMap[node.id]);
}
}
return rootNodes;
}
// 平铺的节点数组示例
const nodes = [
{ id: 1, name: 'Node 1', parentId: null },
{ id: 2, name: 'Node 1.1', parentId: 1 },
{ id: 3, name: 'Node 1.1.1', parentId: 2 },
{ id: 4, name: 'Node 1.2', parentId: 1 },
{ id: 5, name: 'Node 2', parentId: null },
{ id: 6, name: 'Node 2.1', parentId: 5 }
];
// 转换为树状结构
const tree = listToTree(nodes);
console.log(tree);