参考:火辣辣前端博客
题目:写一个函数,输入一段合法的字符数组(n<1024),请用JavaScript从字符数组中找出最大的数值,比如(asc23423v234),得到的最大数值是23423。注意:数值为常用数值表达方式。(建议不要用正则,基本是死路)
部分测试用例:
1)输入asc23423v234,输出23423
2)输入pppp12bbbbbb12.31cccc,输出31
3)输入54.4…6Ⅲ-44.4+++5-4,输出54.4
解题:
function calcMaxNumber(str) {
//转成数组
let arr = str.split('');
// 控制断字
let bool = false;
// 选取数字和.的正则
let regexp = /[\d|.]/i;
let filterArr = [];
//把连续数字和带点的连续数字抽取成新的数组
arr.reduce((resStr, value, index, arr) => {
if (regexp.test(value)) {
bool = true;
if (index === arr.length - 1) {
let str = resStr + value;
return filterArr.push(str);
}
return resStr + value;
} else {
if (bool) {
filterArr.push(resStr);
}
bool = false;
return '';
}
}, '');
// 对过滤的数组中带有.的项进行拆分
filterArr = filterArr.map(num => {
if (num.includes('.')) {
return handlePointStr(num);
} else {
return num;
}
});
//对有.的字符串 进行处理 例如‘21.23.34’ 返回 [21.23,23.34,34]
function handlePointStr(str) {
let arr = str.split('.');
if (arr[arr.length - 1] == '') {
arr.splice(arr.length - 1);
}
let newArr = [];
for (i = 0; i < arr.length - 1; i++) {
newArr.push(arr[i] + '.' + arr[i + 1]);
}
newArr.push(arr[arr.length - 1]);
return newArr;
}
// 二维数组进行扁平化
filterArr = filterArr.toString().split(',');
return Math.max(...filterArr);
console.table(filterArr);
}
let max = calcMaxNumber('54..4..6II44.4+++5-4');
console.log(max);