新思路: JS获取任意数据中最大的数字

作者: 万千钧 | 来源:发表于2018-05-02 12:50 被阅读0次

    作者: 万千钧

    转载请注明出处

    先说一下正常的思路

    1. 判断数据类型

    2. 根据不同类型判断是否是最大数字

    3. 过程中如果发现新的数组或者对象, 重复步骤一

    另外一个思路

    1. 通过将数据转换成JSON, 然后通过正则匹配查找出所有的数字, 在进行匹配

    2. 不过在这之前我们要先把对象Key中的数字排除, 它不应该属于数据.

    转换成代码就是这样

    
    //方法一
    
    leta={ a:1,100:[2,4,6], c:{ data:['9',2] }, d:'70'}
    
    /**
     * 由于并不一定知道数据到底是什么样子
     * 所以要进行判断, 然后使用深度优先搜索
     * @param data 传入任意数据
     * @return {Number}
     */
    function deepFirstSearchMax (data) {
      let max = null
    
      /**
       * 判断数据类型, 调用相应的搜索函数
       */
      switch (data.constructor) {
        case Object:
          ObjectSearch(data)
          break
        case Array:
          ArraySearch(data)
          break
        default:
          if (Number(data) > max) {
            max = Number(data)
          }
      }
    
      /**
       * 如果数据是对象, 进行对象遍历
       * @param {Object} obj 传入的对象
       */
      function ObjectSearch (obj) {
        for (let key in obj) {
          let data = obj[key]
    
          switch (data.constructor) {
            case Object:
              ObjectSearch(data)
              break
            case Array:
              ArraySearch(data)
              break
            default:
              if (Number(data) > max) {
                max = Number(data)
              }
          }
        }
      }
    
      /**
       * 如果是数据是数组, 进行数组遍历
       * @param arr
       */
      function ArraySearch (arr) {
        arr.forEach(data => {
          switch (data.constructor) {
            case Object:
              ObjectSearch(data)
              break
            case Array:
              ArraySearch(data)
              break
            default:
              if (Number(data) > max) {
                max = Number(data)
              }
          }
        })
      }
    
      return max
    }
    
    
    
    //方法二
    
    /**
     * 灵感来自于Object的深拷贝
     * 可以通过JSON来把对象中所有的值取出来, 正则匹配数字, 然后找出最大数字
     * 但是必须先解决如果 Object 的 Key 有数字的情况
     * 所以先把所有Key中带有数字的替换成随机英文字符串
     * @param data
     * @return {Number}
     */
    function jsonHack (data) {
      /**
       * 把所有Object中带数字的key替换成随机的英文字符串
       * @param {Object} obj
       */
      function changeObjectKey (obj) {
        for (let key in obj) {
          let data = obj[key]
          if (data.constructor === Object) {
            changeObjectKey(data)
          } else {
            if (/[0-9]/.test(key)) {
              let randomStr = ''
              for (let i = 0; i < 10; i++) {
                randomStr += String.fromCharCode(65 + Math.ceil(Math.random() * 25))
              }
              obj[randomStr] = obj[key]
              delete obj[key]
            }
          }
        }
      }
    
      /**
       * 获取任意对象中最大的数字
       * @param {Object} obj
       * @return {number}
       */
      function getMaxNumber (obj) {
        let numberArray = JSON.stringify(obj)
          .match(/[0-9]+/g)
          .map(val => (Number(val)))
        return Math.max(...numberArray)
      }
    
      if (data.constructor === Object) {
        changeObjectKey(data)
      }
      return getMaxNumber(data)
    }
    

    相关文章

      网友评论

        本文标题:新思路: JS获取任意数据中最大的数字

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