关于tree结构遍历的算法
很多情况下需要自己写一个tree结构遍历算法,如查找指定node,创建指定属性的tree结构
查找指定node
function queryNodeHierarchy(seq,sourceTree,tempTreeChildren){
let i=0,len=sourceTree.length;
if(sourceTree&&sourceTree.length>0){
for(;i<len;i++){
let isFound=compareNode(seq,sourceTree[i],tempTreeChildren);
// console.log('tempTreeChildren:',isFound,sourceTree[i].label,tempTreeChildren);
if(isFound){
break;
}
}
}
// console.log('ddd',tempTreeChildren);
return i;
}
function compareNode(seq,element,tempTree){
let newElement={
...element,
children:[],
};
tempTree.push(newElement);
if(element.id==seq){
newElement.children=getChildren(element);
// console.log("true",tempTree);
return true;
}else{
if(element.children&&element.children.length>0){
let index=queryNodeHierarchy(seq,element.children,newElement.children);
if(index==element.children.length){
tempTree.pop(newElement);
}else{
return true;
}
}else{
tempTree.pop(newElement);
}
}
return false;
}
function getChildren(element){
let children=[];
if(element.children&&element.children.length>0){
element.children.forEach(child=>{
let newChild={...child};
delete newChild.children;
children.push(newChild);
})
}
return children;
}
export default queryNodeHierarchy;
创建制定属性的tree结构
function createTree(arr,nodeKey,label,children,excessFields){
var tree=[];
arr.forEach(item => {
let nodes=createNode(item,nodeKey,label,children,excessFields);
tree.push(nodes);
});
return tree;
}
function createNode(item,nodeKey,label,children,excessFields){
var node={
id:Number(item[nodeKey]),
label:item[label],
children:[],
}
excessFields.forEach(field=>{
node[field]=item[field];
})
if(item[children]){
node.children=createTree(item[children],nodeKey,label,children,excessFields);
}
return node;
}
export default createTree;