JavaScript数组去重首选Set(ES6+),简洁高效且保序;兼容旧环境用filter+indexOf;对象数组或需业务逻辑时选reduce或Map,兼顾性能与灵活性。

JavaScript 数组去重有多种实用方法,核心在于根据场景选择合适的方式:既要考虑兼容性、性能,也要兼顾代码可读性和是否需要保持原顺序。
利用 Set 快速去重(推荐,ES6+)
Set 数据结构天然不重复,配合扩展运算符或 Array.from 是最简洁高效的方式,且自动保留首次出现的顺序。
-
基本写法:
const unique = [...new Set(arr)] -
兼容旧环境:
const unique = Array.from(new Set(arr)) - 适用于字符串、数字等基本类型;对象数组需另处理(Set 对象引用仍视为不同)
使用 filter + indexOf 保持顺序(兼容性好)
通过遍历并只保留当前元素第一次出现的位置,适合需要支持 IE 的项目。
-
写法:
arr.filter((item, index) => arr.indexOf(item) === index) - 时间复杂度为 O(n²),小数组无压力,大数组慎用
- 同样只对基本类型有效;若含对象,需配合 JSON.stringify 或自定义比较逻辑
用 reduce 累积唯一值(灵活可控)
适合需要在去重过程中加入判断逻辑(如忽略大小写、按某属性去重)的场景。
立即学习“Java免费学习笔记(深入)”;
-
基础去重:
arr.reduce((unique, item) => unique.includes(item) ? unique : [...unique, item], []) -
对象数组按 key 去重(如 id):
arr.reduce((unique, item) => unique.some(u => u.id === item.id) ? unique : [...unique, item], []) - 可读性略低,但扩展性强
Map 或对象哈希表(高性能,适合大数据量)
用对象或 Map 记录已见值,避免重复查找,时间复杂度接近 O(n)。
-
基本类型:
const seen = {}; arr.filter(item => !(item in seen) && (seen[item] = true)) -
更安全(防原型污染):改用
new Map()或Object.hasOwn(seen, item) - 注意:对象键会自动转字符串,
{}和[object Object]冲突,慎用于混合类型











