javascript如何实现数组去重_有哪些常用方法可以掌握

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 累积唯一值(灵活可控)

适合需要在去重过程中加入判断逻辑(如忽略大小写、按某属性去重)的场景。

  • 基础去重: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] 冲突,慎用于混合类型
实际开发中,优先用 Set;需兼容老浏览器时选 filter + indexOf;处理对象数组或有业务逻辑时,reduce 或 Map 更合适。不复杂但容易忽略细节。