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)
posted @   VL小小白  阅读(3370)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示