内容提要
本文比较了JavaScript数组去重的四种方法:哈希表、indexOf、filter+indexOf和Set。测试表明,Chrome中哈希表最快,Set次之,indexOf类较慢;Node.js中Set与哈希表性能相近,indexOf类仍较慢。结论是优先使用Set或哈希表去重。
延伸解读
测试环境与数据规模
文章测试使用长度为500的随机数组,数字范围1到50,重复执行500次。这种小规模数据可能无法完全反映大规模数组下的性能差异,但足以看出不同方法的基本趋势。
浏览器与Node.js的性能差异
在Chrome中,哈希表最快,Set次之;而在Node.js中,Set与哈希表性能相近,哈希表反而变慢。这表明不同JavaScript引擎对数据结构的优化策略不同,选择去重方法时需考虑运行环境。
indexOf类方法为何较慢
indexOf需要遍历数组查找元素,时间复杂度为O(n),在去重场景中嵌套使用会导致O(n²)的性能。filter+indexOf更是对每个元素都调用indexOf,因此最慢。
实践建议与注意事项
根据测试,优先使用Set或哈希表去重。Set语法简洁,哈希表兼容性好。但需注意哈希表方法使用对象键,可能将数字转换为字符串,且无法区分类型,如1和'1'会被视为相同。
Q&A
JavaScript 数组去重有哪些常用方法?
文章介绍了四种方法:1. 使用哈希表记录是否重复;2. 使用内建 indexOf 函数判断是否重复;3. 组合内建 filter 和内建 indexOf;4. 使用 new Set()。
在 Chrome 浏览器中,哪种数组去重方法性能最好?
在 Chrome 中,哈希表去重最快,Set 次之,indexOf+array 较慢,indexOf+filter 最慢。性能排序为:哈希表 > Set >> indexof+array >> indexof+filter。
在 Node.js 中,数组去重方法的性能表现如何?
在 Node.js 中,Set 和哈希表性能相近,indexOf+array 较慢,indexOf+filter 最慢。性能排序为:哈希表 = Set >> indexof+array > indexof+filter。
为什么推荐使用 Set 或哈希表进行数组去重?
因为测试表明,在 Chrome 中哈希表最快,Set 次之;在 Node.js 中 Set 与哈希表性能相近,且都远快于 indexOf 类方法。因此优先使用 Set 或哈希表去重。
使用 Set 进行数组去重的代码怎么写?
可以使用扩展运算符和 Set 构造函数:`function uniqueArray4(a) { return [...new Set(a)]; }`。
哈希表去重和 indexOf 去重的主要区别是什么?
哈希表去重通过对象记录已出现的元素,时间复杂度接近 O(n);而 indexOf 去重需要遍历数组并调用 indexOf 检查元素是否已存在,时间复杂度为 O(n^2),因此性能较差。