JavaScript统计数字数组频率时如何让对象键为number类型
原理说明
JS 中普通对象的键仅支持字符串和 Symbol 类型,你传入数字作为键时会被自动转为字符串,这是你遇到类型问题的根本原因。
可选优雅方案
方案1:使用 Map 存储频率统计结果(最推荐)
Map 支持任意类型作为键,可直接保留数字类型的键,不需要额外转换。
你的代码可以改成如下写法:
let freq = new Map() let nums = [1,2,3] nums.forEach(n => { freq.set(n, (freq.get(n) || 0) + 1) }) let uniq = Array.from(freq.keys()) console.log(typeof uniq[0]) // 输出 number
后续校验连续性时可以直接做数值计算,不需要每次转类型:
if (k2 === k1 + 1) { // 直接判断即可 }
方案2:普通对象统一转换键类型
如果你坚持要用普通对象存储,可以在提取键时一次性转成数字数组,不需要每次判断时单独转parseInt:
let freq = {} let nums = [1,2,3] nums.forEach(n => { freq[n] = (freq[n] || 0) + 1 }) // 提取键时一次性转成数字数组 let uniq = Object.keys(freq).map(Number) console.log(typeof uniq[0]) // 输出 number
方案选型建议
- 如果不需要把统计结果直接序列化为JSON,优先选Map,类型安全性更高,遍历、增删操作的性能也更优
- 如果后续需要直接把统计结果转JSON传输,可选方案2,只需要做一次类型转换即可,不需要每次判断都调用
parseInt
内容的提问来源于stack exchange,提问作者packetie
相关产品推荐
相关产品推荐

