JavaScript数组去重的三种常用方法及性能对比

作者:函数茶馆

时间:2026-10-22

浏览:563

本文详细解析了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数组去重技巧对大家的程序设计工作有所帮助。

实用工具推荐

电子包浆

绿化、压缩、噪点和虚拟水印,自由调节做旧程度。

使用 ›
图片压缩

选择画质和输出格式,预览压缩前后的大小。

使用 ›
相关文章