JavaScript将带K/M后缀的字符串数组转换为数字数组及代码优化
问题背景
需要将带K/M倍率后缀的字符串数字数组转换为纯数字数组:
- 输入示例:
[ '39.4K', '83.4K', '1.5M', '111.3K', '5878' ] - 转换规则:后缀
K对应×1000,M对应×1000000,无后缀的字符串直接解析为普通数字 - 期望输出:
[39400, 83400, 1500000, 111300, 5878]
现有可运行实现
var sample = [ '39.4K', '83.4K', '1.5M', '111.3K', '5878' ] function convert(arr) { var conversions = {'K':1000, 'M':1000000} var result = [] for (entry of arr) { var sep = entry.split(/(?=[A-Z])/) if (sep.length == 1) { result.push(parseFloat(sep[0])) } else { var number = parseFloat(sep[0]) * conversions[sep[1]] result.push(number) } } return result } console.log(convert(sample))
现有代码可以输出正确结果,希望了解更优的原生JS实现方案,同时确认JavaScript是否存在原生能力支持这类数字转换。
解答
首先明确:JavaScript没有提供原生API可以自动识别K/M这类自定义倍率后缀完成数字转换,这类场景都需要自行编写匹配规则实现。
下面是更简洁健壮的实现方案:
const sample = [ '39.4K', '83.4K', '1.5M', '111.3K', '5878' ] const unitMultiplier = { K: 1000, M: 1000000 } const convert = arr => arr.map(item => { // 一次性捕获数字部分和可选的单位后缀 const matchRes = item.match(/^([\d.]+)([KM])?$/) if (!matchRes) return NaN const [, numberPart, unit] = matchRes return parseFloat(numberPart) * (unit ? unitMultiplier[unit] : 1) }) console.log(convert(sample)) // 输出 [39400, 83400, 1500000, 111300, 5878]
相比原实现的优化点:
- 用
Array.map直接遍历生成结果数组,不需要手动初始化空数组循环push,代码更简洁 - 正则一次性提取数字和可选单位,不需要先拆分字符串再判断数组长度,逻辑路径更短
- 增加非法格式输入的兜底,遇到不符合规则的条目返回
NaN,不会因为匹配不到单位抛出运行时错误 - 扩展性更强,后续需要支持更多单位(比如B对应10亿)只需要在
unitMultiplier里添加对应键值对即可
如果需要兼容小写的k/m后缀,只需要在匹配前把字符串转成大写即可,把匹配行修改为:const matchRes = item.toUpperCase().match(/^([\d.]+)([KM])?$/)
内容的提问来源于stack exchange,提问作者DataScienceNovice
相关产品推荐
相关产品推荐

