树形结构的数据是在工作当中经常使用到的,下面实例几个比较会频繁遇到的需求,在处理时,基本上都需要通过递归实现。
1、通过某个节点的id,找出其所有的父节点
2、通过某个节点的id,找出他所有的子节点
3、通过某个节点的id,获取其父级名称(或其他)的完整路径信息
4、通过某个节点的id,获取对应节点的完整信息
/**
* 1、根据节点id,获取其所有父节点
* @param {*} list 完整的树结构数组
* @param {*} id 当前点击的id
* @param {*} name 需要对比的id 的属性节点
* @param {*} child 子节点名称
* @returns
*/
getAllParentArr(list,id,name,child){
for(let i in list){
if(list[i][name] == id){
return [list[i]]
}
if (list[i][child]) {
let node = this.getAllParentArr(list[i][child],id,name,child)
if(!!node){
return node.concat(list[i])
}
}
}
}
/**
* 2、通过某个节点的id,找出他所有的子节点
* @param {*} list 当前点击节点的数据(不是总的树结构)
* @param {*} arr 返回的数组 默认为 []
* @returns
*/
getChildIds(list = [], arr = []) {
for (let item of list ) {
arr.push(item.id);
if (item.children && item.children.length) {
this.getChildIds(item.children, arr);
}
}
return arr;
},
/**
* 3、通过某个节点的id,获取其父级名称(或其他)的完整路径信息
* @param {*} tree 树结构数组
* @param {*} value 当前节点的id
* @returns
*/
getItemByIdInTree( tree,value,path=""){
for(var i=0;i<tree.length;i++){
let tempPath = path
tempPath = `${tempPath ? tempPath + '/' : tempPath}${tree[i].name}` // 避免出现在最前面的/
if(tree[i].id == value){
return tempPath
} else if(tree[i].children){
let reuslt = this.getItemByIdInTree(tree[i].children,value,tempPath)
if(reuslt){
return reuslt
}
}
}
},
其实根据id获取树节点的完整信息和第三个方法类似,只需要在返回数据做处理即可
/**
* 4、通过某个节点的id,获取该节点的完整信息
* @param {*} tree 树结构数组
* @param {*} value 当前节点的id
* @returns
*/
getItemByIdInTree( tree,value){
for(var i=0;i<tree.length;i++){
let item = tree[i]
if(tree[i].id == value){
return item
} else if(tree[i].children){
let reuslt = this.getItemByIdInTree(tree[i].children,value)
if(reuslt){
return reuslt
}
}
}
},
目前只用过这些,如果有再遇到新的需求会继续补充
有问题欢迎指出