本文详细解析了JavaScript中数组去重的三种常用实现方式:基于indexOf的遍历法、利用对象键值查找的哈希表法以及先排序后比较邻接元素的排序法。通过实际代码示例与大规模数据测试,对比了各方法的执行效率,指出哈希表法在查找速度上具有显著优势,为开发者选择合适去重策略提供参考。
JavaScript数组去重方法概览
本文通过具体实例,详细讲解JavaScript中实现数组去重的几种常见技术手段,旨在为读者提供实用的代码参考。
在开发面试及日常编程中,去除数组重复元素是一项高频考点且极具实用价值的技巧。下文将逐一介绍几种主流的实现方案。
基于遍历与indexOf的基础去重
最直观且基础的做法是引入一个临时数组。遍历原数组的每个元素,在将其加入临时数组前,先检查该元素是否已存在于临时数组中。具体实现代码如下:
// 对数组进行去重操作,只考虑数组中元素为数字或字符串,返回一个去重后的数组
//第一种方法,遍历,将没有的插入临时数组
function uniqArray1(arr) {
var n=[];
for(var i=0;i<arr.length;i++){
//如果当前项已经保存到了临时数组,则跳过,否则加入
if(n.indexOf(arr[i])==-1){
n.push(arr[i]);
}
}
return n;
}
基于哈希表的高效去重
是否存在更高效的方案?我们可以借鉴哈希表的思想。在JavaScript中,通过对象键(Key)查找值的效率远高于通过数组索引查找。因此,可以创建一个对象作为哈希表,用于记录已处理的元素。每次处理新元素时,只需检查该元素是否作为键存在于对象中,从而判断是否重复。具体实现代码如下:
//第二种方法,使用哈希表
function uniqArray2(arr){
var n={},//哈希表
r=[];//零时数组
for(var i=0;i<arr.length;i++){
if(n[arr[i]]==null){//如果哈希表中没有,则添加到哈希表,且进入临时数组
n[arr[i]]=true;
r.push(arr[i]);
}
}
return r;
}
基于排序与邻接比较的去重
还有一种策略,虽然其速度不及哈希表法,但优于单纯使用indexOf的基础遍历法。其核心思路是先对数组进行排序,然后比较相邻的元素,若相邻元素不同,则将其加入临时数组。具体实现代码如下:
//第三种方法,先排序,再比较邻接部分
function uniqArray3(arr){
arr.sort();
var r=[arr[0]];
for(var i=1;i<arr.length;i++){
if(arr[i]!=r[r.length-1]){//由于已经经过了排序,所以相邻的是相同的
r.push(arr[i]);
}
}
return r;
}
性能测试与结果分析
为了验证上述三种方法的实际表现,我们编写了以下测试代码:
//验证数组去重函数的使用
var arr=[2,3,4,2,4,5,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3];
for(var i=0;i<10000000;i++){//为了分辨出花费时间的区别,特此增加数组的长度
arr.push(3);
}
var time1=Date.now();
var n1=uniqArray1(arr);
var time2=Date.now();
console.log(n1);//2,3,4,5说明第一种去重成功
console.log(time2-time1);//218
time1=Date.now();
var n2=uniqArray2(arr);
time2=Date.now();
console.log(n2);//2,3,4,5说明第二种去重成功
console.log(time2-time1);//63,说明对象下标的引用要比indexOf搜索快得多
time1=Date.now();
var n3=uniqArray3(arr);
time2=Date.now();
console.log(n3);//2,3,4,5说明第三种去重成功
console.log(time2-time1);//203,说明sort方法使用快排,比indexOf快,但是没有哈希快
从测试结果可以看出,基于哈希表算法的执行速度是最快的。
此外,这里再为大家提供几款实用的去重复在线工具,供日常开发参考:
在线去除重复项工具: http://tools.jb51.net/code/quchong
在线文本去重复工具: http://tools.jb51.net/aideddesign/txt_quchong
更多关于JavaScript相关内容感兴趣的读者可查看本站专题:《JavaScript数组操作技巧总结》、《JavaScript排序算法总结》、《JavaScript数学运算用法总结》、《JavaScript数据结构与算法技巧总结》、《JavaScript遍历算法与技巧总结》、《JavaScript查找算法技巧总结》及《JavaScript错误与调试技巧总结》
希望本文所述的JavaScript数组去重技巧对大家的程序设计工作有所帮助。