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

JavaScript:降序排序数组时保留重复元素位置的实现问题

JavaScript 数组去重元素降序排序(保留重复元素位置)

核心思路

  • 统计元素出现次数:用Map统计数组中每个元素的出现次数,快速区分重复元素(出现次数>1)和非重复元素(出现次数=1),比手动循环检查更可靠,避免重复判断的错误。
  • 记录非重复元素的位置:遍历原数组,把所有非重复元素的索引和对应值单独存起来。
  • 排序非重复元素:将提取到的非重复元素按降序排列。
  • 回填排序结果:把排序好的非重复元素依次放回原数组对应的索引位置,重复元素保持原位不动。

代码实现

function sortUniqueDesc(arr) {
    // 统计每个元素的出现次数
    const countMap = new Map();
    arr.forEach(num => {
        countMap.set(num, (countMap.get(num) || 0) + 1);
    });

    // 收集非重复元素的索引和值
    const uniqueIndices = [];
    const uniqueValues = [];
    arr.forEach((num, index) => {
        if (countMap.get(num) === 1) {
            uniqueIndices.push(index);
            uniqueValues.push(num);
        }
    });

    // 对非重复元素降序排序
    uniqueValues.sort((a, b) => b - a);

    // 生成结果数组(不修改原数组)
    const result = [...arr];
    uniqueIndices.forEach((pos, idx) => {
        result[pos] = uniqueValues[idx];
    });

    return result;
}

示例验证

示例1:含单个重复元素

const input1 = [4, 2, 5, 4, 7, 3];
console.log(sortUniqueDesc(input1)); // 输出: [4, 7, 5, 4, 3, 2]

示例2:含多个重复元素

const input2 = [3, 4, 3, 4, 2, 8];
console.log(sortUniqueDesc(input2)); // 输出: [3, 4, 3, 4, 8, 2]

示例3:无重复元素(全量降序)

const input3 = [6, 2, 9, 5, 3, 4];
console.log(sortUniqueDesc(input3)); // 输出: [9, 6, 5, 4, 3, 2]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 22:01:04