zoukankan      html  css  js  c++  java
  • 一维数组结果判断是否存在于树状结构数据中

    <!DOCTYPE html>
    <html lang="en">
    
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>Document</title>
    </head>
    
    <body>
      <script>
        // 后端返回的选中的id
        const idList = ['2002', '01'];
    
        //树状结构数据
        const treeList = [
          {
            id: '0',
            children: [
              {
                id: '2000',
                children: [{ id: '01' }]
              },
              {
                id: '2001',
                children: [{
                  id: '01',
                  children: [{ id: '02' }]
                }, {
                  id: '02'
                }]
              },
              {
                id: '2002',
                children: [{ id: '01' }]
              }
            ]
          }
        ];
    
        // 判断是否存在
        const duibiWrapp = (idList, temp) => {
          let recursionCount = 0;
          const duibi = (temp) => {
            if (temp.children) {
              console.log(`-----------第${recursionCount + 1}层级比较:------------`);
              for (let i = 0; i < temp.children.length; i++) {
                if (temp.children[i].id === idList[recursionCount]) {
                  console.log(`第${recursionCount + 1}层值${idList[recursionCount]}--->树形结构中的该层值${temp.children[i].id}:匹配`);
                  recursionCount++
                  duibi(temp.children[i]);
                  break;
                } else {
                  console.log(`第${recursionCount + 1}层值${idList[recursionCount]}--->树形结构中的该层值${temp.children[i].id}:不匹配`);
                }
              }
            }
          }
          duibi(temp);
          return idList.length === recursionCount;
    
        }
    
        // 打印输出
        const hasExt = duibiWrapp(idList, treeList[0]);
        console.warn(hasExt ? '存在' : '不存在');
      </script>
    </body>
    
    </html>

    然后给你一个可以直接导出的方法吧:

    /**
     * 根据后端返回的一维数组id,来判断是否存在与树状结构中
     * @param idList 后端返回的选中的一位数组的id
     * @param treeList 树状结构数据
     */
    export const duibiWrapp = (idList, treeList) => {
        let recursionCount = 0;
        const duibi = (treeList) => {
            if (treeList.children) {
                for (const iterator of treeList.children) {
                    if (iterator.id === idList[recursionCount]) {
                        recursionCount++;
                        duibi(iterator);
                        break;
                    }
                }
            }
        };
        duibi(treeList);
        return idList.length === recursionCount;
    };

    ps:去掉打印和空行真的没有几行了,我就不信还有比这个更简洁有力的

    补充:如果考虑到兼容第一层的数据,也写好了

    <!DOCTYPE html>
    <html lang="en">
    
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>Document</title>
    </head>
    
    <body>
      <script>
        // 后端返回的选中的id
        // 选中id
        const idList = ['0', '2002', '01'];
    
        //树状结构数据
        const treeList = [
          {
            id: '0',
            children: [
              {
                id: '2000',
                children: [{ id: '01' }]
              },
              {
                id: '2001',
                children: [{
                  id: '01',
                  children: [{ id: '02' }]
                }, {
                  id: '02'
                }]
              },
              {
                id: '2002',
                children: [{ id: '01' }]
              }
            ]
          }
        ];
    
        // 判断是否存在
        const duibiWrapp = (idList, temp) => {
          if (idList[0] !== temp[0].id) {
            return false;
          };
          idList.shift();
          let recursionCount = 0;
          const duibi = (temp) => {
            if (temp.children) {
              for (const iterator of temp.children) {
                if (iterator.id === idList[recursionCount]) {
                  recursionCount++
                  duibi(iterator);
                  break;
                }
              }
            }
          }
          duibi(temp[0]);
          return idList.length === recursionCount;
        }
    
        // 打印输出
        const hasExt = duibiWrapp(idList, treeList);
        console.warn(hasExt ? '存在' : '不存在');
      </script>
    </body>
    
    </html>

    如果不想用递归,我邀请211的同学写个非递归的版本

    <!DOCTYPE html>
    <html lang="en">
    
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>Document</title>
    </head>
    
    <body>
      <script>
        // 后端返回的选中的id
        // 选中id
        const idList = ['2001', '01','02'];
    
        //树状结构数据
        const treeList = [
          {
            id: '0',
            children: [
              {
                id: '2000',
                children: [{ id: '01' }]
              },
              {
                id: '2001',
                children: [{
                  id: '01',
                  children: [{ id: '02' }]
                }, {
                  id: '02'
                }]
              },
              {
                id: '2002',
                children: [{ id: '01' }]
              }
            ]
          }
        ];
    
        function duibiWrapp(params, treeList) {
          var children = treeList[0].children;
          var b = false;
          var k = 0;
          while (k < params.length) {
            var v1 = params[k];
            var f = false;
            for (var i = 0; i < children.length; i++) {
              var id = children[i].id;
              var child = children[i].children;
              if (id == v1) {
                if(child){
                  children = child;
                }
                f = true;
                break;
              }
            }
            if (!f) {
              break;
            } else {
              k++;
            }
          }
          if (k == (params.length)) {
            b = true;
          }
          return b;
        }
    
        const hasExt = duibiWrapp(idList, treeList);
        console.warn(hasExt ? '存在' : '不存在');
      </script>
    </body>
    
    </html>

    还有第三个版本

    <!DOCTYPE html>
    <html lang="en">
    
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>Document</title>
    </head>
    
    <body>
      <script>
        const idList = ['0', '2001', '01'];
    
        //树状结构数据
        const treeList = [
          {
            id: '0',
            children: [
              {
                id: '2000',
                children: [
                  {
                    id: '01'
                  }
                ]
              },
              {
                id: '2001',
                children: [
                  {
                    id: '01'
                  },
                  {
                    id: '02'
                  }
                ]
              },
              {
                id: '2001',
                children: [
                  {
                    id: '01'
                  }
                ]
              }
            ]
          },
          {
            id: '2',
            children: [
              {
                id: '2000',
                children: [
                  {
                    id: '01'
                  }
                ]
              },
              {
                id: '2001',
                children: [
                  {
                    id: '01'
                  },
                  {
                    id: '02'
                  }
                ]
              },
              {
                id: '2001',
                children: [
                  {
                    id: '01'
                  }
                ]
              }
            ]
          }
        ];
    
        /**
         * 查找索引
         * @param {str} item
         * @param {any[]} list
         * @return {number} 返回结果
         */
        function findIndex(item, list) {
          return list.findIndex(i => i.id === item);
        }
    
        let list = treeList;
        let flag = true;
    
        idList.forEach(str => {
          if (flag) {
            const indexNumber = findIndex(str, list);
            if (indexNumber > -1) {
              list = list[indexNumber].children ? list[indexNumber].children : [];
            } else {
              flag = false;
            }
          }
        });
        console.log(flag);
      </script>
    </body>
    
    </html>
    View Code
  • 相关阅读:
    Oracle中有大量的sniped会话
    Error 1130: Host '127.0.0.1' is not allowed to connect to this MySQL server
    汉字转换为拼音以及缩写(javascript)
    高效率随机删除数据(不重复)
    vs2010 舒服背景 优雅字体 配置
    mvc中的ViewData用到webfrom中去
    jquery ajax return值 没有返回 的解决方法
    zShowBox (图片放大展示jquery版 兼容性好)
    动感效果的TAB选项卡 jquery 插件
    loading 加载提示······
  • 原文地址:https://www.cnblogs.com/dshvv/p/12464890.html
Copyright © 2011-2022 走看看