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

如何用JavaScript实现按频率降序、值降序的数组排序?

按出现频率降序、同频率按元素值降序排列数组的实现方案

嘿,我来帮你搞定这个数组排序需求!你需要把原始数组处理成按元素出现频率从高到低排列,如果两个元素频率相同,再按元素自身数值从高到低排列的结果对吧?原代码里forEach加判断的思路很难实现这个需求,我给你一个清晰高效的最优方案:

实现步骤拆解

  • 第一步:统计每个元素的出现频率:遍历原始数组,用对象记录每个元素的出现次数。
  • 第二步:对唯一元素排序:提取所有唯一元素,按照「频率降序优先,频率相同则元素值降序」的规则排序。
  • 第三步:生成目标数组:根据排序后的元素和对应频率,把每个元素重复对应次数后拼接成最终数组。

完整代码实现

// 原始数组
const origin = [5, 7, 1, 0, 6, 5, 2, 7, 1, 5, 6];
// 1. 统计每个元素的出现频率
const frequencyMap = {};
origin.forEach(val => {
  frequencyMap[val] = (frequencyMap[val] || 0) + 1;
});
// 2. 对唯一元素排序:先按频率降序,频率相同则按元素值降序
const sortedUniqueElements = Object.keys(frequencyMap)
  .map(Number) // 将字符串类型的键转换为数字
  .sort((a, b) => {
    // 优先比较频率,频率高的排前面
    if (frequencyMap[b] !== frequencyMap[a]) {
      return frequencyMap[b] - frequencyMap[a];
    }
    // 频率相同时,元素值大的排前面
    return b - a;
  });
// 3. 生成最终数组:将每个元素按频率重复后展开
const newArr = sortedUniqueElements.flatMap(val => Array(frequencyMap[val]).fill(val));
// 渲染到页面
document.getElementById("result").innerHTML = JSON.stringify(newArr);
<div id="result"></div>

代码细节解释

  1. 频率统计:frequencyMap对象存储每个元素的出现次数,比如5对应的值是3,表示它在原始数组里出现了3次。
  2. 排序逻辑:sort函数里先对比两个元素的频率,频率大的排前面;如果频率相同,就对比元素本身的数值,数值大的排前面。
  3. 生成目标数组:用flatMap替代传统的forEach+push,它会自动把每个元素生成的重复数组展开,代码更简洁高效。

这个方案的时间复杂度主要由排序环节决定,为O(n log n),对于大多数业务场景来说都足够高效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:33:32