javascript数组去重方法终极总结


Posted in Javascript onJune 05, 2014

有时会碰上这种需求,需要将数组中重复的元素删除掉,而只保留一个。最先想到的办法很可能就是用2个for循环来做比较然后去除掉重复的元素,代码如下所示:

方法1:

Array.prototype.distinct = function(){
 var arr = [],
      len = this.length;
 for ( var i = 0; i < len; i++ ){
  for( var j = i+1; j < len; j++ ){
   if( this[i] === this[j] ){
    j = ++i;
   }
  }
  arr.push( this[i] );
 }
 return arr;
};

使用方法1如果碰到数据比较多时性能上会差很多。那么请继续看下面的方法。

方法2:

Array.prototype.distinct = function(){ var self = this,
  arr = self.concat().sort(); // 创建一个新数组并排序
 arr.sort(function( a, b ){
  if( a === b ){
   var n = self.indexOf( a ); //获取索引值
   self.splice( n, 1 );
  }
 });
 return self;
};

方法2使用了 sort 的自定义回调函数,也用到了 indexOf 这个IE6/7/8不支持的方法。当然,indexOf可以自己模拟,但是更大的问题是IE6/7/8的sort方法和标准浏览器之间也有差别。在IE6/7/8中使用 sort 方法的自定义回调函数陷阱比较多,上面的自定义 sort 的回调函数的代码在IE6/7/8中会直接报“缺少数字”的错误,回调函数的返回是NaN的话就会报这个错,因为理论上 sort 的回调函数只能返回整数。就算忽略返回值的问题还是有其他问题,最后也没有过多的去纠结了,方法2在IE6/7/8中行不通。

从愚人码头那里看来了方法3,下面是他的代码:

Array.prototype.delRepeat=function(){
 var newArray=[];
 var provisionalTable = {};
 for (var i = 0, item; (item= this[i]) != null; i++) {
        if (!provisionalTable[item]) {
            newArray.push(item);
            provisionalTable[item] = true;
        }
    }
    return newArray;
};

方法3使用了一个临时的对象来存储数组的元素,如果碰上重复的数组元素,将会忽略掉。但是,如果碰到下面这种数组:

var arr = [ 'firefox', 1, '1' ];

上面的数组如果用方法3会误将 1 和 “1” 当成重复元素而删除掉,于是有将方法3做了一点点的小修改,可以解决这个BUG。
方法3的修改版:

Array.prototype.distinct = function(){
 var arr = [],
  obj = {},
  i = 0,
  len = this.length,
  result;
 for( ; i < len; i++ ){
  result = this[i];
  if( obj[result] !== result ){
   arr.push( result );
   obj[result] = result;
  }
 }
 return arr;
};

之后又看了愚人码头文章后面的评论,该方法和Rekey提供的方法是一样的,但是这个方法也有BUG,如果碰到这样的2B数组就杯具了:

var arr = [ 'firefox', 1, '1', 1 ];

上面的数组用方法3的修改版,将不会删除后3个元素,不过这种数组有点极端了,如果碰到字符串字面量和数字相同的数据应该预先处理下以规避这种BUG。使用临时对象的方法比 sort 在标准浏览器中略快,sort 方法在各浏览器中的算法应该也有区别。

Javascript 相关文章推荐
对象的类型:本地对象(1)
Dec 29 Javascript
Dreamweaver jQuery智能提示插件,支持版本提示,支持1.6api
Jul 31 Javascript
给html超链接设置事件不使用href来完成跳
Apr 20 Javascript
Node.js中的process.nextTick使用实例
Jun 25 Javascript
基于jquery实现的树形菜单效果代码
Sep 06 Javascript
浅析jQuery Ajax通用js封装
Jun 22 Javascript
JS留言功能的简单实现案例(推荐)
Jun 23 Javascript
vue3.0 CLI - 2.4 - 新组件 Forms.vue 中学习表单
Sep 14 Javascript
js的对象与函数详解
Jan 21 Javascript
详解用场景去理解函数柯里化(入门篇)
Apr 11 Javascript
vue从一个页面跳转到另一个页面并携带参数的解决方法
Aug 12 Javascript
javascript实现拼图游戏
Jan 29 Javascript
javascript设计模式之解释器模式详解
Jun 05 #Javascript
javascript监听鼠标滚轮事件浅析
Jun 05 #Javascript
详解JavaScript语法对{}处理的坑爹之处
Jun 05 #Javascript
封装了一个支持匿名函数的Javascript事件监听器
Jun 05 #Javascript
用js读、写、删除Cookie代码分享及详细注释说明
Jun 05 #Javascript
NODE.JS加密模块CRYPTO常用方法介绍
Jun 05 #Javascript
jquery左边浮动到一定位置时显示返回顶部按钮
Jun 05 #Javascript
You might like
php结合飞信 免费天气预报短信
2009/05/07 PHP
PHP ? EasyUI DataGrid 资料存的方式介绍
2012/11/07 PHP
php获取新浪微博数据API实例
2013/11/12 PHP
php顺序查找和二分查找示例
2014/03/27 PHP
PHP实现文件下载断点续传详解
2014/10/15 PHP
php实现屏蔽掉黑帽SEO的搜索关键字
2015/04/15 PHP
PHP Streams(流)详细介绍及使用
2015/05/12 PHP
PHP实现上传多图即时显示与即时删除的方法
2017/05/09 PHP
Prototype Date对象 学习
2009/07/12 Javascript
js拖动div 当鼠标移动时整个div也相应的移动
2013/11/21 Javascript
jQuery简单几行代码实现tab切换
2015/03/10 Javascript
JavaScript实现多个重叠层点击切换效果的方法
2015/04/24 Javascript
用JS生成UUID的方法实例
2016/03/30 Javascript
实用又漂亮的BootstrapValidator表单验证插件
2016/05/30 Javascript
关于javascript中限定时间内防止按钮重复点击的思路详解
2016/08/16 Javascript
jquery的checkbox,radio,select等方法小结
2016/08/30 Javascript
JS异步文件上传(兼容IE8+)
2017/04/02 Javascript
vue .sync修饰符的使用详解
2018/06/15 Javascript
JS实现数组去重,显示重复元素及个数的方法示例
2019/01/21 Javascript
JS实现图片切换特效
2019/12/23 Javascript
node.js中 mysql 增删改查操作及async,await处理实例分析
2020/02/11 Javascript
解决vue+elementui项目打包后样式变化问题
2020/08/03 Javascript
通过滑动翻页效果实现和移动端click事件问题
2021/01/26 Javascript
Pyhton中单行和多行注释的使用方法及规范
2016/10/11 Python
基于python的七种经典排序算法(推荐)
2016/12/08 Python
virtualenv实现多个版本Python共存
2017/08/21 Python
python版简单工厂模式
2017/10/16 Python
Python实现嵌套列表及字典并按某一元素去重复功能示例
2017/11/30 Python
python+opencv识别图片中的圆形
2020/03/25 Python
python多进程间通信代码实例
2019/09/30 Python
Python大数据之从网页上爬取数据的方法详解
2019/11/16 Python
基于python cut和qcut的用法及区别详解
2019/11/22 Python
Python函数的返回值、匿名函数lambda、filter函数、map函数、reduce函数用法实例分析
2019/12/26 Python
python实现最短路径的实例方法
2020/07/19 Python
院药学专业个人求职信
2013/09/21 职场文书
2019职场实习报告该怎么写?
2019/07/01 职场文书