美文网首页
tree 递归查询必填字段校验

tree 递归查询必填字段校验

作者: DeadMoon | 来源:发表于2022-04-10 19:25 被阅读0次

    故事背景: 接到一个自定义多级下拉的需求, 功能已经完成,但是在提交数据时测试提出要做非空校验, 意思就是如果有层级存在空字段, 需要跳到该层级并给出提示, 不用递归实现的话, 三次 for 循环还是挺好实现的, 但是作为一个有追求的 coder, 我们最终还是通过递归的方式来实现的,毕竟 leetcode 也刷了几十道了, 也该考验一下刷题的效果了.

    效果如下:

    Kapture 2022-04-10 at 18.44.13.gif
    首先我们来看下 json-tree 格式
    /**
    *@desc value 就是表单绑定的值
    */
    [{
        "value":"0",
        "child":[{
            "value":"0-0",
            "child":[{
                "value":"",
                "nodeId":"c0",
                "pnodeId":"b0",
                "uniqueness":"0.14658520948272225"
             }],
            "nodeId":"b0",
            "pnodeId":"a0",
            "uniqueness":"0.49521203933283897"
        }],
        "nodeId":"a0",
        "pnodeId":0,
        "uniqueness":"0.6101862372680027"
    },
    {
        "value":"1",
        "child":[{
            "value":"1-1",
            "child":[],
            "nodeId":"b0",
            "pnodeId":"a1",
            "uniqueness":"0.9895125407132053"
         },
         {
            "value":"",
            "child":[],
            "nodeId":"b1",
            "pnodeId":"a1",
            "uniqueness":"0.25298626352369147"
        }],
        "nodeId":"a1",
        "pnodeId":0
    }]
    

    写的有点糙,请不要介意,算法如下:

      const indexs = [] // 用户存储 index 路劲
      let flag = true  // 申明一个全局变量,可以在闭包中可以访问, 从而使 for 可以跳出来
      function formValidation(arr, l = 0) {
          for (let i = 0; i < arr.length; i++) {
              if (!flag) { // 跳出 for 循环的标识, 如果 value 为空, 深度向上遍历跳出 for 循环
                  break
              }
              if (l === 0) { // 每一级的路径我们是通过 Array 形式 存储的, 如果这里不清空, 校验下一列的时候还会存留上一列的数据
                  indexs.length = 0 // 这种方式清除 Array, 算是骚操作吧, 但确实优化了判断逻辑
              }
              indexs[l] = i // 将列的路径存在 array 中
              if (!String(arr[i].value).trim()) { // 判断 value 是否为空, 为空就需要跳出 for 循环, 这里用到了闭包, 代码层面看只有一层, 但是实际运行时, 是 for 循环里面嵌套 for 循环的.
                  indexs.length = l // 将 数组的长度 与 递归的深度保持一致(打个比方: 比如第一层第三级遍历完了, 后面会继续遍历第二级数据, 遍历第二层数据时, 之前的第三级数据我们是要清除的, 所以我们直接通过 array length 来清除)
                  indexs[l] = i
                  flag = false
                  break
              } 
              if (arr[i].child?.length) { // 有子集 递归遍历
                  formValidation(arr[i].child, l + 1)
              }
          }
      }
    

    相关文章

      网友评论

          本文标题:tree 递归查询必填字段校验

          本文链接:https://www.haomeiwen.com/subject/xaovsrtx.html