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
相关产品推荐
相关产品推荐

