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+ 元素):
- Set:约 1 毫秒(最快)
- Map(用于对象):约 2 毫秒
- Reduce:约 50 毫秒
- Filter:约 100 毫秒(最慢)
推荐
- 对于原始值(数字、字符串、布尔值),使用 Set
- 对于对象,如果需要根据特定属性去重,使用 Map
- 仅在需要自定义逻辑或处理小型数组时,使用 Filter 或 Reduce
注意: 所有这些方法都会创建一个新数组。如果需要直接修改原始数组,则需要采用不同的方法。