作者: 萬千鈞
轉(zhuǎn)載請注明出處
先說一下正常的思路
判斷數(shù)據(jù)類型
根據(jù)不同類型判斷是否是最大數(shù)字
過程中如果發(fā)現(xiàn)新的數(shù)組或者對象, 重復步驟一
另外一個思路
通過將數(shù)據(jù)轉(zhuǎn)換成JSON, 然后通過正則匹配查找出所有的數(shù)字, 在進行匹配
不過在這之前我們要先把對象Key中的數(shù)字排除, 它不應該屬于數(shù)據(jù).
轉(zhuǎn)換成代碼就是這樣
//方法一
leta={ a:1,100:[2,4,6], c:{ data:['9',2] }, d:'70'}
/**
* 由于并不一定知道數(shù)據(jù)到底是什么樣子
* 所以要進行判斷, 然后使用深度優(yōu)先搜索
* @param data 傳入任意數(shù)據(jù)
* @return {Number}
*/
function deepFirstSearchMax (data) {
let max = null
/**
* 判斷數(shù)據(jù)類型, 調(diào)用相應的搜索函數(shù)
*/
switch (data.constructor) {
case Object:
ObjectSearch(data)
break
case Array:
ArraySearch(data)
break
default:
if (Number(data) > max) {
max = Number(data)
}
}
/**
* 如果數(shù)據(jù)是對象, 進行對象遍歷
* @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)
}
}
}
}
/**
* 如果是數(shù)據(jù)是數(shù)組, 進行數(shù)組遍歷
* @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來把對象中所有的值取出來, 正則匹配數(shù)字, 然后找出最大數(shù)字
* 但是必須先解決如果 Object 的 Key 有數(shù)字的情況
* 所以先把所有Key中帶有數(shù)字的替換成隨機英文字符串
* @param data
* @return {Number}
*/
function jsonHack (data) {
/**
* 把所有Object中帶數(shù)字的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]
}
}
}
}
/**
* 獲取任意對象中最大的數(shù)字
* @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)
}