最常用且稳妥的去重升序方式是先用 Set 去重再调 sort();数字数组需传比较函数,字符串建议用 localeCompare;兼容老环境可用 filter+indexOf;reduce 可实现插入排序但可读性差;注意类型转换、NaN、对象及浮点数精度问题。

用 Set + sort() 一行去重并升序排列
最常用也最稳妥的方式是先用 Set 去重,再调用 sort() 排序。注意:sort() 默认按字符串 Unicode 码点排序,数字数组必须传比较函数,否则 [10, 2, 33] 会变成 [10, 2, 33](因为 "10" 为 true)。
实操建议:
立即学习“Java免费学习笔记(深入)”;
- 数字数组:写成
[...new Set(arr)].sort((a, b) => a - b) -
字符串数组(纯英文/ASCII):可直接用
[...new Set(arr)].sort() - 含中文或需要稳定排序时,建议加
localeCompare:[...new Set(arr)].sort((a, b) => a.localeCompare(b)) - 原数组含
undefined、null或对象时,Set能保留它们,但sort()可能抛错,需提前过滤
filter() 配合 indexOf 实现去重(兼容老环境)
当目标运行环境不支持 Set(如 IE11),可用 filter() + indexOf() 组合。原理是只保留第一次出现的元素。
实操建议:
立即学习“Java免费学习笔记(深入)”;
- 写法:
arr.filter((item, index) => arr.indexOf(item) === index) - 该方法对
NaN无效(NaN !== NaN),若数组可能含NaN,得额外处理 - 性能比
Set差,时间复杂度 O(n²),大数据量慎用 - 去重后仍需手动调
sort(),不能一步到位
用 reduce() 同时去重和排序(控制力更强)
如果想在一次遍历中完成去重+插入排序(比如边读边排,避免后续全量排序),reduce() 更灵活。适合对性能或顺序有明确要求的场景。
本书是全面讲述PHP与MySQL的经典之作,书中不但全面介绍了两种技术的核心特性,还讲解了如何高效地结合这两种技术构建健壮的数据驱动的应用程序。本书涵盖了两种技术新版本中出现的最新特性,书中大量实际的示例和深入的分析均来自于作者在这方面多年的专业经验,可用于解决开发者在实际中所面临的各种挑战。 本书内容全面深入,适合各层次PHP和MySQL开发人员阅读,既是优秀的学习教程,也可用作参考手册。
实操建议:
立即学习“Java免费学习笔记(深入)”;
- 升序插入示例:
arr.reduce((acc, cur) => { if (!acc.includes(cur)) { const i = acc.findIndex(x => x > cur); acc.splice(i === -1 ? acc.length : i, 0, cur); } return acc; }, []) - 该写法天然稳定,且避免了
sort()的副作用(如修改原数组引用) - 但代码可读性下降,调试成本略高;若数组已基本有序,插入排序效率不错,否则不如先去重再快排
- 注意
includes()对NaN同样失效,需用some()+Object.is()替代
去重时要注意的隐式类型转换陷阱
Set 和 === 判断一致,但容易忽略隐式转换带来的“看似重复实则不同”问题。例如 "1" 和 1 在 Set 中是两个值,而业务上你可能希望它们算重复。
实操建议:
立即学习“Java免费学习笔记(深入)”;
- 若需统一类型后再去重,先做映射:
[...new Set(arr.map(String))].sort()或[...new Set(arr.map(Number))].sort((a, b) => a - b) - 对象数组去重不能靠
Set,得基于某个 key(如id)用Map或filter()+findIndex() - 浮点数精度问题(如
0.1 + 0.2 !== 0.3)会导致去重失败,必要时先四舍五入再比较
实际项目里,90% 场景用第一种就够了。真正要纠结的是:你要去重的是什么类型?是否必须保序?运行环境是否受限?这些比“怎么写”更影响最终选型。










