sort本身不能去重,需先排序再遍历比较相邻元素;因排序后相同值必相邻,仅需o(n)单次遍历,适合原地操作或避免额外空间的场景。

JavaScript 中 sort 本身是排序方法,**不能直接用于去重**;所谓“用 sort 实现去重”,其实是先排序,再遍历比较相邻元素,跳过重复项——这是一种借助排序特性的去重策略,不是 sort 自身的功能。
为什么先排序再比相邻?
排序后相同元素必然相邻,只需一次遍历,每次只和前一个元素比较,时间复杂度为 O(n),比暴力双循环(O(n²))或 Set(O(n)但需额外空间)在某些场景下更易理解或满足特定约束(如必须原地、不用额外数据结构)。
基本实现步骤
- 调用
arr.sort()对数组升序排序(注意:对数字要传比较函数,否则按字符串排序) - 创建新数组,初始放入第一个元素(若原数组非空)
- 从索引 1 开始遍历,若当前元素 ≠ 前一个元素,则推入结果数组
代码示例(数字/字符串通用)
✅ 正确处理数字:
function uniqueBySort(arr) {
if (arr.length === 0) return [];
// 先排序(数字用 (a, b) => a - b)
const sorted = arr.slice().sort((a, b) => a - b);
const result = [sorted[0]];
for (let i = 1; i // 示例
console.log(uniqueBySort([3, 1, 4, 1, 5, 9, 2, 6, 5])); // [1, 2, 3, 4, 5, 6, 9]
注意事项
-
不要直接在原数组上 sort 后遍历去重:如果要求不修改原数组,记得用
slice()或展开语法复制 -
字符串数组可省略比较函数:
sort()默认按 Unicode 排序,对纯字符串去重可行;但含数字字符串(如['10', '2'])会出错,此时仍需自定义排序逻辑 -
无法处理对象等引用类型:因为
===比较的是引用,即使内容相同也视为不同;如需对象去重,应基于某个字段(如 id),先按该字段排序再比值











