1 概述
对嵌套数组求和,需要将数组扁平化,然后循环遍历数组中的值。题目 sum([1, 'x', '4x', ['8', ['x2', '5']]])
的难点在于,如果执行 parseInt('x2')
,那么将返回 NaN
。
2 代码实现
const findNumInStringRegex = /\d+/;
// 扁平化数组
const flattenArr = (arr, result = []) => {
for (let i = 0, length = arr.length; i < length; i++) {
const value = arr[i];
if (Array.isArray(value)) {
flattenArr(value, result);
} else {
result.push(value);
}
}
return result;
};
function sum(arr) {
// const flattenArr = arr.flat(2);
const flattenedArr = flattenArr(arr);
let sum = 0;
for (let i = 0; i < flattenedArr.length; i++) {
const num = flattenedArr[i];
if(typeof num === "number") {
sum += num;
} else {
// 不是数字
const num_ = parseInt(num);
// 此处是难点,需要单独处理。如果判断结果为真,
// 那么就要提取出字符旁边的数字。
if(isNaN(num_)) {
let findNumInString = num.match(findNumInStringRegex);
// console.log(num_, num, findNumInString, parseInt(findNumInString));
if(findNumInString) findNumInString = parseInt(findNumInString);
sum += findNumInString;
} else {
sum += num_;
}
}
}
return sum;
}
const out = sum([1, 'x', '4x', ['8', ['x2', '5']]])
console.log(out);