zoukankan      html  css  js  c++  java
  • 树形数据结构递归,forEach终止循环,for循环里面嵌套if语句执行顺序问题

    1、树形结构递归通过id找到对应label:

    export function findTreeItem(table, id, key = 'id') {
      let hasFound = false // 表示是否有找到id值
      let result = null
      const fn = function(data) {
        if (Array.isArray(data) && !hasFound) {
          console.log('是数组')
          // 判断是否是数组并且没有的情况下
        data.some(item => {    //使用some替换forEach,forEach无法终止循环
          if (data.find(item => item[key] == id)) {  //不能使用if item[key]==id),否则for循环执行完之后才能进入if语句。
            // 数据循环每个子项,并且判断子项下边是否有id值
           result = data.find(item => item[key] == id)  //find返回的是符合条件的数据,而不是true或者false
    // 返回的结果等于每一项
            console.log(result)
            hasFound = true // 并且找到id值
            return true  //跳出循环体,终止循环。
          } else if (item.children) {
            fn(item.children) // 递归调用下边的子项
          }
      })
         }  
      }
      fn(table) // 调用一下
      return result
    }
     
    注意:当有多条数据需要实现通过code查找label的时候,最好不要使用for循环,用find循环来代替,但是以上方法并不能真是实现树形查找,因为some依然无法终止循环,使用try catch(){}来终止循环,并使用for in来循环。
    export function getNode(data,id){
       console.log(data)
       console.log(id)
        let keyWord=id;
        let columnDefs=data;
        let res_name=''
         try{
          const findName=(columnDef)=>{
          if(columnDef.id==keyWord){
            console.log('相等')
          throw columnDef;
          }
         if(columnDef.children && columnDef.children.length>0){
            for(let i in columnDef.children){
            findName(columnDef.children[i]);
            }
             }
          }
         for(let i in columnDefs){
         findName(columnDefs[i])
       }
      }catch(name){
      res_name=name
      }
      return res_name;
      }

    export function getNode(data,id){
       console.log(data)
       console.log(id)
        let keyWord=id;
        let columnDefs=data;
        let res_name=''
         try{
          const findName=(columnDef)=>{
          if(columnDef.id==keyWord){
            console.log('相等')
          throw columnDef;
          }
         if(columnDef.children && columnDef.children.length>0){
            for(let i in columnDef.children){
            findName(columnDef.children[i]);
            }
             }
          }
         for(let i in columnDefs){
         findName(columnDefs[i])
       }
      }catch(name){
      res_name=name
      }
      return res_name;
      }
  • 相关阅读:
    [iOS]UIDynamicAnimator动画
    [iOS]被忽略的main函数
    [iOS]app的生命周期
    vue 封装http请求时错误信息提示使用element-ui message,只提示一次
    angular8 Vue 导出excel文件
    python3 tornado api + angular8 + nginx 跨域问题
    ubutu tornado python3.7.5 nginx supervisor 部署web api
    angular cli 反向代理实现跨域
    angular8自定义管道、指令以及获取dom值
    angular cli 使用echarts
  • 原文地址:https://www.cnblogs.com/panzai/p/15760127.html
Copyright © 2011-2022 走看看