一个十分简单的通用树结构递归遍历方法,使用示例:
let tree = {
name: "root",
childrens: [{
name: "child1"
}, {
name: "child2",
childrens: [{
name: "child2-1"
},{
name: "child2-2"
}
]
},{
name: "child3"
}]
}
treeForEach(tree,function(node,parent){
if(!parent){
parent = "this is a root,no parent!";
}
console.log(node,parent);
});
树结构遍历通用方法:
function treeForEach(treeNode,fn,childFieldName = "childrens"){
let parent = null;
//如果节点是数组,直接遍历
if (Array.isArray(treeNode)) {
let childrens = treeNode;
forEachChilds(parent, childrens, fn);
return;
}
//如果节点不是数组,直接调用方法
if (!Array.isArray(treeNode)) {
fn && fn(treeNode, parent);
}
//如果存在子节点集则遍历
if(treeNode && treeNode[childFieldName]){
parent = treeNode;
let childrens = treeNode[childFieldName];
forEachChilds(parent, childrens, fn);
return;
}
//递归遍历子节点
function forEachChilds(parent,childrens,fn){
if(Array.isArray(childrens)){
childrens.forEach((item,index)=>{
fn && fn(item,parent);
//如果有子节点集,则继续遍历
let childrens = item[childFieldName];
if(Array.isArray(childrens)){
forEachChilds(item,childrens,fn);
}
});
return;
}
}
}