作者: 万千钧
转载请注明出处
先说一下正常的思路
-
判断数据类型
-
根据不同类型判断是否是最大数字
-
过程中如果发现新的数组或者对象, 重复步骤一
另外一个思路
-
通过将数据转换成JSON, 然后通过正则匹配查找出所有的数字, 在进行匹配
-
不过在这之前我们要先把对象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)
}
网友评论