JavaScript数组去重推荐用Set配合扩展运算符,排序需传入比较函数避免Unicode默认排序错误;去重加排序应先去重再排序,并注意sort会修改原数组,对象去重需基于属性判断,NaN在Set中被统一处理。

JavaScript 中数组去重和排序可以分开做,也可以组合处理,关键看是否需要保留原始顺序、是否允许修改原数组、以及数据类型(如含对象需特殊处理)。
去重:常用且可靠的方法
现代 JavaScript 推荐用 Set 配合扩展运算符,简洁且兼容性好(ES6+):
-
[...new Set(arr)]—— 去重并保持首次出现顺序,适用于字符串、数字等基本类型 - 若需兼容旧环境(如 IE),可用
filter+indexOf:arr.filter((item, index) => arr.indexOf(item) === index) - 含对象的数组不能直接用 Set 去重,需基于某个属性(如 id)判断唯一性:
arr.filter((item, index, self) => self.findIndex(obj => obj.id === item.id) === index)
排序:按数值或字符串规则排列
数组的 sort() 方法默认按字符串 Unicode 码点排序,数字会出错(如 10 排在 2 前),必须传入比较函数:
- 升序(数字):
arr.sort((a, b) => a - b) - 降序(数字):
arr.sort((a, b) => b - a) - 字符串升序:
arr.sort((a, b) => a.localeCompare(b))(推荐,支持中文、重音等) - 忽略大小写:
arr.sort((a, b) => a.toLowerCase().localeCompare(b.toLowerCase()))
去重 + 排序:链式调用更清晰
通常先去重再排序,避免重复影响排序结果。注意 sort 会修改原数组,如需不修改,应先拷贝:
立即学习“Java免费学习笔记(深入)”;
- 基本类型(数字/字符串):
[...new Set(arr)].sort((a, b) => a - b) - 对象数组按某字段去重并排序(如按 age 升序):
arr.filter((item, i, self) => self.findIndex(v => v.id === item.id) === i)<br> .sort((a, b) => a.age - b.age)
- 一行写法易读性差,建议拆成两步或封装为函数,便于复用和调试
注意事项与常见坑
几个容易忽略但影响结果的细节:
-
sort()返回的是原数组引用,不是新数组 —— 想保留原数组就先用slice()或扩展运算符拷贝 - 空字符串、
null、undefined在排序中会被转为字符串,可能打乱预期顺序,建议提前过滤 - 浮点数精度问题不影响去重(Set 会精确比较),但排序时若涉及计算,要注意
0.1 + 0.2 !== 0.3 - 去重时
NaN !== NaN,但 Set 会把所有 NaN 当作同一个值处理(符合预期)


















