js逆向遞歸 一個多維數組根據子節點ID查找所有父節點ID


這個是我寫的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)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM