返回技术笔记
programming
JavaScript

从数组中删除重复项

在 JavaScript 中从数组中删除重复值的不同方法

在 JavaScript 中,从数组中删除重复项是一项常见任务。以下是几种有效的方法来实现这一点。

方法 一:使用 Set(推荐)

最简单且性能最好的去重方法是使用 Set

const array = [1, 2, 2, 3, 4, 4, 5]
const uniqueArray = [...new Set(array)]
console.log(uniqueArray) // [1, 2, 3, 4, 5]

优点:

  • 简洁明了
  • 性能良好,时间复杂度为 O(n)
  • 适用于原始值

缺点:

  • 仅适用于原始值(数字、字符串、布尔值)
  • 对象是按引用比较的

方法 二:使用 Filter

在更复杂的场景中,或需要保留第一次出现的元素时:

const array = [1, 2, 2, 3, 4, 4, 5]
const uniqueArray = array.filter((value, index, self) => {
  return self.indexOf(value) === index
})
console.log(uniqueArray) // [1, 2, 3, 4, 5]

优点:

  • 适用于自定义逻辑
  • 容易理解

缺点:

  • 由于使用 indexOf,性能较差,时间复杂度为 O(n²)

方法 三:使用 Reduce

使用 reduce 的函数式方法:

const array = [1, 2, 2, 3, 4, 4, 5]
const uniqueArray = array.reduce((acc, current) => {
  if (!acc.includes(current)) {
    acc.push(current)
  }
  return acc
}, [])
console.log(uniqueArray) // [1, 2, 3, 4, 5]

优点:

  • 函数式编程风格
  • 可以与其他转换结合使用

缺点:

  • 由于使用 includes,性能较差
  • 代码较为冗长

方法 四:处理对象(使用 Map)

在处理对象时,需要根据特定属性进行比较:

const users = [
  { id: 1, name: 'Alice' },
  { id: 2, name: 'Bob' },
  { id: 1, name: 'Alice' },
  { id: 3, name: 'Charlie' }
]

const uniqueUsers = Array.from(new Map(users.map((user) => [user.id, user])).values())

console.log(uniqueUsers)
// [
//   { id: 1, name: 'Alice' },
//   { id: 2, name: 'Bob' },
//   { id: 3, name: 'Charlie' }
// ]

优点:

  • 适用于对象
  • 可以指定用于唯一性的属性
  • 性能良好

缺点:

  • 语法较为复杂
  • 保留的是最后一次出现的元素(可以修改为保留第一次出现的元素)

性能比较

对于大型数组(10,000+ 元素):

  1. Set:约 1 毫秒(最快)
  2. Map(用于对象):约 2 毫秒
  3. Reduce:约 50 毫秒
  4. Filter:约 100 毫秒(最慢)

推荐

  • 对于原始值(数字、字符串、布尔值),使用 Set
  • 对于对象,如果需要根据特定属性去重,使用 Map
  • 仅在需要自定义逻辑或处理小型数组时,使用 FilterReduce

注意: 所有这些方法都会创建一个新数组。如果需要直接修改原始数组,则需要采用不同的方法。