编程题:手写一维数组转换树节点
思路一般是先遍历一遍查找节点,接着递归分类父子节点
var array = [
{pid: 4, id: 6617, name: "a",subNode:[]},
{pid: 5, id: 666, name: "a",subNode:[]},
{pid: 4, id: 6616, name: "a",subNode:[]},
{pid: 6616, id: 66161, name: "a",subNode:[]},
{pid: -1, id: 0, name: "a",subNode:[]},
{pid: 0, id: 4, name: "a",subNode:[]},
{pid: 0, id: 5, name: "a",subNode:[]},
{pid: 4, id: 10, name: "a",subNode:[]},
{pid: 10, id: 451, name: "a",subNode:[]},
{pid: 0, id: 98, name: "a",subNode:[]},
{pid: 98, id: 23, name: "a",subNode:[]},
{pid: 98, id: 523, name: "a",subNode:[]}
];
var toTree = function(tarArray) { }
toTree(array);
代码实现
js:生成树结构(一维数组转树形结构、生成树菜单)
用了点es6
var toTree = function(tarArray) {
var resultTree;
var findChildren = tree=>{
tree.forEach(node=>{
node.children = tarArray.filter(cNode=>cNode.pid === node.id);
if (node.children.length) {
findChildren(node.children);
}
}
);
}
if (tarArray && tarArray.length > 0) {
// step1:把跟节点首先放进数组,根节点支持:null 0 ""
const tmpTree = tarArray.filter(node=>!node.pid);
// step2:递归生成节点及子节点数据
findChildren(tmpTree)
resultTree = tmpTree;
}
findChildren = null;
return resultTree;
}
输出结果
json result
[
{
"pid": 0,
"id": 4,
"name": "a",
"subNode": [
],
"children": [
{
"pid": 4,
"id": 6617,
"name": "a",
"subNode": [
],
"children": [
]
},
{
"pid": 4,
"id": 6616,
"name": "a",
"subNode": [
],
"children": [
{
"pid": 6616,
"id": 66161,
"name": "a",
"subNode": [
],
"children": [
]
}
]
},
{
"pid": 4,
"id": 10,
"name": "a",
"subNode": [
],
"children": [
{
"pid": 10,
"id": 451,
"name": "a",
"subNode": [
],
"children": [
]
}
]
}
]
},
{
"pid": 0,
"id": 5,
"name": "a",
"subNode": [
],
"children": [
{
"pid": 5,
"id": 666,
"name": "a",
"subNode": [
],
"children": [
]
}
]
},
{
"pid": 0,
"id": 98,
"name": "a",
"subNode": [
],
"children": [
{
"pid": 98,
"id": 23,
"name": "a",
"subNode": [
],
"children": [
]
},
{
"pid": 98,
"id": 523,
"name": "a",
"subNode": [
],
"children": [
]
}
]
}
]