You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修复JavaScript数组多众数提取代码?避免众数重复输出

修复提取唯一众数的JavaScript代码

原代码的问题在于遍历数组时,会对每个重复元素重复计算出现次数,并且每次遇到计数等于当前最大次数时就直接将元素加入结果数组,导致同一个众数被多次添加。以下是两种修复方案:

方案一:先统计频率(高效推荐)

先通过对象统计每个元素的出现次数,再基于频率找出所有众数,这种方法时间复杂度为O(n),效率更高,且自然避免重复元素:

const array = [1, 1, 2, 2, 2, 5, 5, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 9];
// 统计元素出现频率
const frequencyMap = {};
for (const num of array) {
  frequencyMap[num] = (frequencyMap[num] || 0) + 1;
}

// 获取最大出现次数
const maxStreak = Math.max(...Object.values(frequencyMap));

// 收集所有众数
const modus = Object.keys(frequencyMap)
  .map(Number) // 将字符串键转换为数字类型
  .filter(num => frequencyMap[num] === maxStreak);

console.log(modus); // 输出:[7, 8]

方案二:在原代码基础上修改

如果要保留原代码的遍历逻辑,只需添加判断条件,确保当前元素未被加入结果数组时再执行添加操作:

const array = [1, 1, 2, 2, 2, 5, 5, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 9];
let maxStreak = 0; 
let modus = [];

for (let i = 0; i < array.length; i++) {
  let series = 0;
  for (let j = 0; j < array.length; j++) {
    if (array[i] === array[j]) {
      series++;
    }
  }
  
  if (series > maxStreak) {
    maxStreak = series;
    modus = [array[i]]; // 重置结果数组为当前元素
  } else if (series === maxStreak && !modus.includes(array[i])) {
    // 仅当元素未在结果数组中时添加
    modus.push(array[i]);
  }
}

console.log(modus); // 输出:[7, 8]

内容的提问来源于stack exchange,提问作者LukaM

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 12:31:00