JavaScript数组去重
导读
在JavaScript中,数组去重有多种实现方式。本文将对10种常见的去重方法进行性能分析,并按执行时间从快到慢排序。
性能排序
以下是10种去重方法的性能排序(从最快到最慢):
- 使用
Set - 使用
Array.from和Set - 使用
reduce和Set结合 - 使用
Object或Map - 使用
reduce和Object结合 - 使用
filter和indexOf - 使用
forEach和includes - 使用
reduce - 使用
for循环 - 使用
lodash库
性能分析
1. 使用 Set
Set 是专门用于存储唯一值的数据结构,其去重操作的时间复杂度为 O(n),是所有方法中最快的。
1 | const uniqueArray = [...new Set(array)]; |
2. 使用 Array.from 和 Set
与直接使用 Set 类似,Array.from 将 Set 转换为数组,性能接近 Set。
1 | const uniqueArray = Array.from(new Set(array)); |
3. 使用 reduce 和 Set 结合
通过 reduce 和 Set 结合,性能略低于直接使用 Set,但仍非常高效。
1 | const uniqueArray = Array.from(array.reduce((acc, item) => acc.add(item), new Set())); |
4. 使用 Object 或 Map
利用对象的键或 Map 的唯一性,时间复杂度为 O(n),但由于对象操作的开销,性能略低于 Set。
1 | const uniqueArray = Object.keys(array.reduce((acc, item) => (acc[item] = true, acc), {})); |
5. 使用 reduce 和 Object 结合
与上一种方法类似,但使用 Object.values 提取值,性能稍低。
1 | const uniqueArray = Object.values(array.reduce((acc, item) => (acc[item] = item, acc), {})); |
6. 使用 filter 和 indexOf
indexOf 的时间复杂度为 O(n),因此整体时间复杂度为 O(n^2),性能较差。
1 | const uniqueArray = array.filter((item, index) => array.indexOf(item) === index); |
7. 使用 forEach 和 includes
includes 的时间复杂度为 O(n),因此整体时间复杂度为 O(n^2),性能与 filter 和 indexOf 接近。
1 | const uniqueArray = []; |
8. 使用 reduce
通过 reduce 和 includes 结合,时间复杂度为 O(n^2),性能较差。
1 | const uniqueArray = array.reduce((acc, item) => (!acc.includes(item) && acc.push(item), acc), []); |
9. 使用 for 循环
传统的 for 循环结合 includes,时间复杂度为 O(n^2),性能较差。
1 | const uniqueArray = []; |
10. 使用 lodash 库
lodash 的 _.uniq 方法虽然方便,但由于是第三方库,性能通常不如原生方法。
1 | const uniqueArray = _.uniq(array); |
总结
| 方法 | 时间复杂度 | 性能排名 |
|---|---|---|
使用Set |
O(n) | 1 |
使用Array.from 和 Set |
O(n) | 2 |
使用reduce 和 Set 结合 |
O(n) | 3 |
使用Object 或 Map |
O(n) | 4 |
使用reduce 和 Object 结合 |
O(n) | 5 |
使用filter 和 indexOf |
O(n^2) | 6 |
使用forEach 和 includes |
O(n^2) | 7 |
使用reduce |
O(n^2) | 8 |
使用for 循环 |
O(n^2) | 9 |
使用lodash 库 |
O(n) | 10 |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 程序员零塔的小破站!
评论