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 许可协议。转载请注明来源 程序员零塔的小破站!
评论