這個是我寫的demo案例:
var a = [ //數組樹型結構
{
dir:'',
no:'11111'
},
{
dir:[
{
dir:'',
no:'22221'
},
{
dir:[
{
dir:'',
no:'33332'
}
],
no:'22222'
}
],
no:'11112'
},
{
dir:[
{
dir:[
{
dir:[],
no:'33333'
}
],
no:'22223'
}
],
no:'11113'
},
{
dir:[
{
dir:[
{
dir:[
{
dir:[],
no:'44444'
}
],
no:'33334'
}
],
no:'22224'
}
],
no:'11114'
},
]
數組就是類似這種結構,然后我需要拿后台返回的某個子集no,查找所有相關聯父級no,並把它們放到一個集合里面,下面直接貼代碼:
var b = '44444' //這就相當於從后台返回的id值
var vArr = [] //用來接收相關聯父級id的集合
function shellArr(obj,id){
if(obj.length){
obj.forEach(item => {
if (item.dir && item.dir.length) {
if (item.dir.some(row => row.no === id)) { //這里利用some篩選子級有沒有符合條件的,有就重新遞歸,沒有就繼續遞歸
vArr.unshift(item.no)
//重新遞歸
shellArr(a,item.no)
}else{
//繼續遞歸
shellArr(item.dir, id)
}
}else{return}
})
}
}
shellArr(a,b); //調用,傳入a為要篩選的數組,傳入b為后台返回的id值
console.log(vArr) //打印所有相關父級集合
如果有錯誤,請小伙伴們點出來,我會繼續研究的嘿嘿
過了兩天,這里有原生版的主要是為了兼容IE瀏覽器
function tree(list,id){
for(var i=0;i<list.length;i++){
if(list[i].dir && list[i].dir.length){
for(var j=0;j<list[i].dir.length;j++){
if(list[i].dir[j].no == id){
vArr.unshift(list[i].no)
tree(a,list[i].no)
return
}else{
tree(list[i].dir,id)
}
}
}else{
continue
}
}
}
formTree(a,b)