/*
* 传入的数组有id和父节点pid字段,通过它们的关联构造成一棵或多棵树结构
* @param nodes 集合
* @param treeRootId 根节点的id
*/
function createTreeData(nodes, treeRootId) {
var groups = {};
// 按父节点将节点分组
for (var i in nodes) {
if (!groups[nodes[i].pid]) {
groups[nodes[i].pid] = [];
}
groups[nodes[i].pid].push(nodes[i]);
if (treeRootPid && treeRootPid === nodes[i].id) { // 发现传入的根节点id作为节点id时,将根节点设置为该节点的父节点
treeRootPid = nodes[i].pid;
}
}
var rootNodes = groups[treeRootPid];
groups[treeRootPid] = null; // [SAFEGUARD]防止自为父节点或互为父节点(有环图结构)导致的死循环
function traverseTreeNodeGroup(treeNodeGroup) {
for (var i in treeNodeGroup) {
var node = treeNodeGroup[i];
if (groups[node.id]) {
node.children = groups[node.id];
groups[node.id] = null; // [SAFEGUARD]防止自为父节点或互为父节点(有环图结构)导致的死循环
traverseTreeNodeGroup(node.children);
}
}
}
traverseTreeNodeGroup(rootNodes);
return rootNodes;
}
// 测试数组
var nodes = [
{id: '01', pid: '0'},
{id: '02', pid: '0'},
{id: '011', pid: '01'},
{id: '012', pid: '01'},
{id: '021', pid: '02'},
{id: '022', pid: '02'},
{id: '0221', pid: '022'},
{id: '0222', pid: '022'}
];
// 调用
createTreeData(nodes, '0');
/* 返回如下结构
[
{
"id": "01",
"pid": "0",
"children": [
{
"id": "011",
"pid": "01"
},
{
"id": "012",
"pid": "01"
}
]
},
{
"id": "02",
"pid": "0",
"children": [
{
"id": "021",
"pid": "02"
},
{
"id": "022",
"pid": "02",
"children": [
{
"id": "0221",
"pid": "022"
},
{
"id": "0222",
"pid": "022"
}
]
}
]
}
]
*/