如何获取数组中出现指定次数的数字?
实现方法
这很容易实现!核心思路就是先统计数组中每个数字的出现次数,再筛选出次数恰好等于指定值n的数字。这里给你两种可行的实现方式:
方法一:使用 Map(推荐,无需类型转换)
function scr(array, n) { // 用 Map 统计每个数字的出现次数 const countMap = new Map(); for (const num of array) { countMap.set(num, (countMap.get(num) || 0) + 1); } // 筛选出出现次数等于 n 的数字,并转化为数组返回 return Array.from(countMap) .filter(([num, count]) => count === n) .map(([num]) => num); } // 测试你的示例 console.log(scr([187,187,187,187,187,62,62,43,43,43,43,43,5,5,5], 5)); // 输出: [187, 43]
代码解释
Map可以直接以数字作为键,避免了类型转换的麻烦- 遍历数组时,每次更新对应数字的计数:如果数字已在Map中,计数+1;否则初始化为1
- 最后通过
Array.from把Map转为二维数组,用filter筛选计数等于n的项,再用map提取数字部分
方法二:使用普通对象
function scr(array, n) { const countObj = {}; // 统计每个数字的出现次数 array.forEach(num => { countObj[num] = (countObj[num] || 0) + 1; }); // 筛选结果并转换回数字类型(因为对象键默认是字符串) return Object.entries(countObj) .filter(([numStr, count]) => count === n) .map(([numStr]) => Number(numStr)); }
代码解释
- 用普通对象存储计数,键会自动转为字符串,所以最后需要用
Number()把键转回到数字类型 - 逻辑和Map版本一致,只是存储结构不同
两种方法都能满足你的需求,Map版本在处理数字类型时更直观,推荐使用。
内容的提问来源于stack exchange,提问作者user9279766
相关产品推荐
相关产品推荐

