JavaScript数组去重首选Set(ES6+),简洁高效且保序;兼容旧环境用filter+indexOf;对象数组或需业务逻辑时选reduce或Map,兼顾性能与灵活性。
JavaScript 数组去重有多种实用方法,核心在于根据场景选择合适的方式:既要考虑兼容性、性能,也要兼顾代码可读性和是否需要保持原顺序。
Set 数据结构天然不重复,配合扩展运算符或 Array.from 是最简洁高效的方式,且自动保留首次出现的顺序。
const unique = [...new Set(arr)]
const unique = Array.from(new Set(arr))
通过遍历并只保留当前元素第一次出现的位置,适合需要支持 IE 的项目。
arr.filter((item, index) => arr.indexOf(item) === index)
适合需要在去重过程中加入判断逻辑(如忽略大小写、按某属性去重)的场景。
arr.reduce((unique, item) => unique.includes(item) ? unique : [...unique, item], [])
arr.reduce((unique, item) => unique.some(u => u.id === item.id) ? unique : [...unique, item], [])
用对象或 Map 记录已见值,避免重复查找,时间复杂度接近 O(n)。
const seen = {}; arr.filter(item => !(item in seen) && (seen[item] = true))
new Map() 或 Object.hasOwn(seen, item)
{} 和 [object Object] 冲突,慎用于混合类型