JavaScript 数组去重的四种方法详解与性能对比
本文详细解析JavaScript中数组去重的四种常见实现方式,包括基于indexOf的两种方法、利用Hash表的第二种方法以及先排序后比较的第四种方法。通过生成万级随机数组的测试程序,对比各方法的执行时间与内存占用,指出Hash方法在速度上的优势及空间换时间的特性,为开发者提供实用的性能参考。
JavaScript 数组去重方法概述
本文介绍在 JavaScript 中对数组进行去重处理的四种实现方案。
具体包含以下四种算法来实现这一目标:
第一种实现方案如下:
基于 indexOf 的两种去重方案
Array.prototype.unique1 = function () {
var n = []; //一个新的临时数组
for (var i = 0; i < this.length; i++) //遍历当前数组
{
//如果当前数组的第i已经保存进了临时数组,那么跳过,
//否则把当前项push到临时数组里面
if (n.indexOf(this[i]) == -1) n.push(this[i]);
}
return n;
}
第二种实现方案如下:
Array.prototype.unique2 = function()
{
var n = {},r=[]; //n为hash表,r为临时数组
for(var i = 0; i < this.length; i++) //遍历当前数组
{
if (!n[this[i]]) //如果hash表中没有当前项
{
n[this[i]] = true; //存入hash表
r.push(this[i]); //把当前数组的当前项push到临时数组里面
}
}
return r;
}
var arr = [1, 'a', 'a', 'b', 'd', 'e', 'e', 1, 0]
alert(arr.unique2());
第三种实现方案如下:
Array.prototype.unique3 = function()
{
var n = [this[0]]; //结果数组
for(var i = 1; i < this.length; i++) //从第二项开始遍历
{
//如果当前数组的第i项在当前数组中第一次出现的位置不是i,
//那么表示第i项是重复的,忽略掉。否则存入结果数组
if (this.indexOf(this[i]) == i) n.push(this[i]);
}
return n;
}
Hash 表方案的性能分析
其中,第一种和第三种方案均依赖于数组的 indexOf 方法。该方法的作用是查找参数在数组中首次出现的位置。由于 JavaScript 引擎在实现此方法时需遍历数组直至找到目标值,因此会消耗较多时间。相比之下,第二种方案采用了 Hash 表机制,将已出现的元素通过下标形式存储在一个对象(object)中。由于对象属性的引用速度远快于使用 indexOf 遍历数组,因此第二种方案在效率上更具优势。
为了验证上述三种方法的实际执行效率,编写了一个测试程序:生成一个长度为 10000 的随机数组,并分别使用各方法进行去重测试。测试结果表明确实第二种方法的速度远超其他两种。然而,在内存占用方面,第二种方法因额外维护了一个 Hash 表,其内存消耗相对较高,这体现了典型的“空间换时间”策略。感兴趣的读者可以访问该测试页面查看具体数据。
第四种实现方案如下:
排序后比较的去重方案
Array.prototype.unique4 = function()
{
this.sort();
var re=[this[0]];
for(var i = 1; i < this.length; i++)
{
if( this[i] !== re[re.length-1])
{
re.push(this[i]);
}
}
return re;
}
该方法的思路是先对数组进行排序,随后比较相邻的两个值。排序过程使用了 JavaScript 原生的 sort 方法,推测其内部实现可能采用了快速排序算法。最终测试结果显示,此方法的平均运行时间约为第二种方法的三倍,但比第一种和第三种方法要快不少。
感谢阅读,希望本文内容能对大家有所帮助,感谢各位对本站的支持!
JS语法错误会阻止加载吗?区分SyntaxError与资源加载失败
2026-11-05 16:08:46
JavaScript常见SyntaxError语法错误排查与修复方法
2026-11-05 13:58:44
JS中slice、substring和substr截取字符串的区别
2026-11-05 13:43:47
JS 转 TS 手动迁移最佳实践:从配置 tsconfig 到消除 any 类型
2026-11-05 11:53:32
为什么JS数组push后得到的是数字而不是数组?
2026-11-05 09:59:18
