如何让Number/parseInt()跳过非数字 不使用flat()实现数组扁平化
问题核心
原有实现通过join()把数组转成字符串再做正则拆分的思路从根源上不可行:
- 数组转字符串的过程会直接丢失原始元素的类型信息,比如对象
{}转字符串会变成"[object Object]",后续处理根本无法还原成原始对象 - 全量用
parseInt处理所有拆分后的字符串,会把非数字内容全部转成NaN,完全不符合保留非数字元素的需求
实现方案
核心逻辑是递归遍历,全程不做字符串转换,从根源保留元素原始类型,不需要依赖flat()方法:
function steamrollArray(arr) { const res = []; for (const item of arr) { if (Array.isArray(item)) { // 遇到数组就递归展开,将展开后的元素依次存入结果 res.push(...steamrollArray(item)); } else { // 非数组元素直接保留原始值存入,不做强制类型转换 res.push(item); } } return res; } // 测试 console.log(steamrollArray([1, {}, [3, [[4]]]])) // 输出结果:[1, {}, 3, 4],和预期完全一致
可选扩展:仅转换纯数字字符串
如果需要把内容为纯数字的字符串转成数值类型、其他非数字元素原样保留,只需要在非数组元素的判断分支里加一层校验即可,避免错误转换:
function steamrollArray(arr) { const res = []; for (const item of arr) { if (Array.isArray(item)) { res.push(...steamrollArray(item)); } else { // 仅当元素是去除首尾空格后全为数字的字符串时,才转成数值 if (typeof item === 'string' && /^\d+(\.\d+)?$/.test(item.trim())) { res.push(Number(item)); } else { res.push(item); } } } return res; }
这个实现的优势:
- 完全不依赖
flat()方法,符合要求 - 不会修改非数组元素的原始类型,对象、非数字字符串、布尔值等内容都会原样保留
- 数字转换逻辑仅对符合数字格式的字符串生效,不会出现把非数字内容转成
NaN的问题
内容的提问来源于stack exchange,提问作者CRISVOSS
相关产品推荐
相关产品推荐

