新思路: 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获取任意数据中最大的数字

    作者: 万千钧 转载请注明出处 先说一下正常的思路 判断数据类型 根据不同类型判断是否是最大数字 过程中如果发现新...

  • function

    求任意数组的最大值 求任意数组的最小值 //求任意范围数字和 求任意数字的总和 // type 检测参数数据类型...

  • JavaScript 数据类型转换

    数据类型 number 在JS中所有的数值都是Number类型,包括整数和浮点数(小数)JS中可以表示的数字的最大...

  • JS数据类型

    可以通过 typeof 数据 的方式获取数据对应的类型typeof 变量typeof 常量 在JS中所有的数字类型...

  • JS初步,类型及转换

    js里运算时会进行判断,自动进行数据类型的转换。也有手动方法进行转换。 类型转换 任意类型转字符串 任意类型转数字...

  • js获取数字数组中的最大值

    Math.max.apply(Math,[9,8,7,2]); Math.max(...[9.8,7,2]);

  • JS动画效果

    JS速度动画 JS透明度动画 JS缓冲动画 JS多物体动画 JS透明度多物体动画 获取样式屬性值 任意属性值 任意...

  • JavaScript 精华

    JS 自身操作部分 1、数据类型 | 变量定义 动态语言,不需要指定参数的数据类型,也就是说可以任意赋值数字 | ...

  • JavaScript 精华一页纸

    JS 自身操作部分 1、数据类型 | 变量定义 动态语言,不需要指定参数的数据类型,也就是说可以任意赋值 数字 |...

  • 二、数据库与数据表--2、SQLServer的数据类型

    (1)文本类型:字符数据包含任意字母、符号或数字字符的组合 char:固定长度的非Unicode字符数据,最大长度...

网友评论

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

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