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 相关文章推荐
js字符串的各种格式的转换 ToString,Format
Aug 08 Javascript
JS截取字符串常用方法详细整理
Oct 28 Javascript
判断字符串的长度(优化版)中文占两个字符
Oct 30 Javascript
JavaScript与HTML的结合方法详解
Nov 23 Javascript
js+css实现回到顶部按钮(back to top)
Mar 02 Javascript
jQuery四种选择器使用及示例
Jun 05 Javascript
AngularJS ng-mousedown 指令
Aug 02 Javascript
修改jquery中dialog的title属性方法(推荐)
Aug 26 Javascript
Bootstrap 过渡效果Transition 模态框(Modal)
Mar 17 Javascript
React Native仿美团下拉菜单的实例代码
Aug 08 Javascript
zTree 树插件实现全国五级地区点击后加载的示例
Feb 05 Javascript
vue2.0 使用element-ui里的upload组件实现图片预览效果方法
Sep 04 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
ThinkPHP 表单自动验证运用示例
2014/10/13 PHP
php类中的$this,static,final,const,self这几个关键字使用方法
2015/12/14 PHP
php使用正则表达式获取字符串中的URL
2016/12/29 PHP
js 判断浏览器类型 去全角、半角空格 自动关闭当前窗口
2009/04/10 Javascript
两个数组去重的JS代码
2013/12/04 Javascript
深入分析js的冒泡事件
2014/12/05 Javascript
jQuery中removeAttr()方法用法实例
2015/01/05 Javascript
Jquery基础教程之DOM操作
2015/08/19 Javascript
jquery实现的判断倒计时是否结束代码
2016/02/05 Javascript
jquery操作ID带有变量的节点实例
2016/12/07 Javascript
JavaScript中 this 指向问题深度解析
2017/02/21 Javascript
javaScript实现滚动条事件详解
2020/03/24 Javascript
详解如何用babel转换es6的class语法
2018/04/03 Javascript
Angular(5.2-&gt;6.1)升级小结
2018/12/27 Javascript
详解keep-alive + vuex 让缓存的页面灵活起来
2019/04/19 Javascript
Python中Numpy ndarray的使用详解
2019/05/24 Python
搭建python django虚拟环境完整步骤详解
2019/07/08 Python
python求加权平均值的实例(附纯python写法)
2019/08/22 Python
详解python中*号的用法
2019/10/21 Python
详解Python 函数参数的拆解
2020/09/02 Python
一款纯css3制作的2015年元旦雪人动画特效教程
2014/12/29 HTML / CSS
汉森批发:Hansen Wholesale
2018/05/24 全球购物
电子商务专业个人的自我评价
2013/12/19 职场文书
职工趣味运动会方案
2014/02/10 职场文书
公务员政审个人鉴定
2014/02/25 职场文书
毕业自我鉴定怎么写
2014/03/25 职场文书
课前三分钟演讲稿
2014/04/24 职场文书
解放思想演讲稿
2014/09/11 职场文书
王兆力在市委党的群众路线教育实践活动总结大会上的讲话稿
2014/10/25 职场文书
2014年审计人员工作总结
2014/12/19 职场文书
失恋33天观后感
2015/06/11 职场文书
师范生见习自我总结
2015/06/23 职场文书
2016年社区植树节活动总结
2016/03/16 职场文书
JavaWeb Servlet实现网页登录功能
2021/07/04 Java/Android
MySQL千万级数据表的优化实战记录
2021/08/04 MySQL
深入理解MySQL中MVCC与BufferPool缓存机制
2022/05/25 MySQL