使用JavaScript Map统计数组元素频次出错,求解决方案
解决Map统计数组元素频次出现NaN的问题
我尝试用JavaScript的Map对象统计数组[1,2,3,4,5,5,5,6,6,6]中数字的出现频次,但运行代码后控制台显示Map中的值都是NaN。代码如下:
let arr=[1,2,3,4,5,5,5,6,6,6]; let map=new Map(); arr.forEach((n)=>{ map.set(n,map.get(n)+1); }); for(let [k,v] of map){ console.log(k,v); }
问题原因
第一次处理数组中每个新元素时,map.get(n)会返回undefined(Map中还未存入该键),而undefined + 1的计算结果是NaN,后续对该元素的累加操作只会持续得到NaN。
解决方法
方法一:给map.get()设置默认值
利用逻辑或运算符,确保首次获取不存在的键时得到默认值0,再执行累加:
let arr=[1,2,3,4,5,5,5,6,6,6]; let map=new Map(); arr.forEach((n)=>{ map.set(n, (map.get(n) || 0) + 1); }); for(let [k,v] of map){ console.log(k,v); }
方法二:先判断元素是否存在
通过map.has()检查当前元素是否已在Map中,不存在则初始化为1,存在则累加:
let arr=[1,2,3,4,5,5,5,6,6,6]; let map=new Map(); arr.forEach((n)=>{ if(map.has(n)){ map.set(n, map.get(n)+1); }else{ map.set(n, 1); } }); for(let [k,v] of map){ console.log(k,v); }
运行结果
修改后执行代码,控制台会输出正确的元素频次:
1 1 2 1 3 1 4 1 5 3 6 3
内容的提问来源于stack exchange,提问作者haobin liu
相关产品推荐
相关产品推荐

