departMentList:[
{
id:'0',
label:'XX市应急局',
isOpen:true,
children:[
{
id:'1',
label:'局领导',
isOpen:true,
children:[
{id:'11',label:'张三',isOpen:true,},
{
id:'12',
label:'武陵区应急局',
isOpen:true,
children:[
{id:'31',label:'李四',isOpen:true,},
{id:'32',label:'王三',isOpen:true,},
{id:'9527',label:'李世明',isOpen:true,},
]
},
{id:'13',label:'王五',isOpen:true,},
]
},
{
id:'2',
label:'安全生产基础科',
isOpen:true,
children:[{id:'21',label:'王小二',isOpen:true,}]
}
]
},
{
id:'1',
label:'XX市应急局',
isOpen:true,
children:[
{
id:'2',
label:'局领导',
isOpen:true,
children:[
{id:'3',label:'张三',isOpen:true,},
{
id:'4',
label:'武陵区应急局',
isOpen:true,
children:[
{id:'31',label:'李四',isOpen:true,},
{id:'32',label:'王三',isOpen:true,},
{id:'9527',label:'李元霸',isOpen:true,},
]
},
{id:'5',label:'王五',isOpen:true,},
]
},
{
id:'6',
label:'安全生产基础科',
isOpen:true,
children:[{id:'7',label:'王小二',isOpen:true,}]
}
]
},
]
分为两种情况,1、查找到一条匹配,就立马返回,一般ID不会重复,所以用下面这种递归:
function find(arr, id) {
if (arr == null) return null;
for (let obj of arr) {
if (obj.id === id) {
return collect(obj);
}
let ret = find(obj.children, id);
if (ret) return ret;
}
return null;
}
function collect(obj) {
let ret = obj;
if (obj.children) {
for (let o of obj.children) {
ret = [...ret, ...collect(o)]
}
}
return ret;
}
console.log(find(departMentList,'9527'))
输出结果:
2、如果需要匹配所有的数据,以数组形式返回,就用这种递归,不要提前结束,一直循环完为止:
var result = [];
function find(arr, id) {
if (arr == null) return null;
for (let obj of arr) {
if (obj.id === id) {
result = [...result, collect(obj)];
}
find(obj.children, id);
}
}
function collect(obj) {
let ret = obj;
if (obj.children) {
for (let o of obj.children) {
ret = [...ret, ...collect(o)]
}
}
return ret;
}
find(departMentList,'9527')
console.log(result)
输出结果:
