methods: {
menuSearch() {
//深拷贝防止改变源数据
const arr = this.subMenus
let sourceDto = arr.concat()
if (this.searchKey) {
this.menusArr = this.childrenFn(sourceDto, this.searchKey)
let codes = this.lookForAllCodes(this.menusArr, [])
this.defaultOpeneds = codes
} else {
this.menusArr = this.subMenus
}
},
/**
* @param arr 传入的树结构
* @param key 需要搜索的关键字
*/
childrenFn(arr, key) {
const that = this
let searchTree = []
arr.forEach((item) => {
if (item.children != undefined && item.children.length != 0) {
let leaf = that.childrenFn(item.children, key)
//如果叶子节点为空,说明没找到,去找一下叶子节点的上一级
if (leaf != undefined) {
let { name, id, parentId, code } = item
let parentObj = { id, name, parentId, code, children: leaf, }
searchTree.push(parentObj)
} else {
//如果是中间节点有关键字,把中间节点作为叶子节点往回传
if (item.name.indexOf(key) != -1) {
delete item["children"]
searchTree.push(item)
}
}
} else {
//如果是最后一级,回传
if (item.name.indexOf(key) != -1) {
searchTree.push(item)
}
}
})
if (searchTree != undefined && searchTree.length != 0) {
return searchTree
}
},
/**
* 递归遍历查找所有code
* @param data 传入的树结构
* @param arr 查询结果
*/
lookForAllCodes(data = [], arr = []) {
if (!Array.isArray(arr)) {
return arr
} else {
for (let item of data) {
arr.push(item.code)
if (item.children && item.children.length)
this.lookForAllCodes(item.children, arr)
}
}
return arr
},
},