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 相关文章推荐
JavaScript Tips 使用DocumentFragment加快DOM渲染速度
Jun 28 Javascript
JavaScript使用cookie记录临时访客信息的方法
Apr 07 Javascript
详解javascript高级定时器
Dec 31 Javascript
浅析Bootstrip的select控件绑定数据的问题
May 10 Javascript
JavaScript必知必会(六) delete in instanceof
Jun 08 Javascript
jQuery.form.js的使用详解
Jun 14 jQuery
详解js几个绕不开的事件兼容写法
Aug 30 Javascript
vue实现提示保存后退出的方法
Mar 15 Javascript
微信小程序把百度地图坐标转换成腾讯地图坐标过程详解
Jul 10 Javascript
基于vue写一个全局Message组件的实现
Aug 15 Javascript
JsonServer安装及启动过程图解
Feb 28 Javascript
在HTML中使用JavaScript的两种方法
Dec 24 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
让你的WINDOWS同时支持MYSQL4,MYSQL4.1,MYSQL5X
2006/12/06 PHP
CI配置多数据库访问的方法
2016/03/28 PHP
Laravel 微信小程序后端实现用户登录的示例代码
2019/11/26 PHP
在JavaScript中使用inline函数的问题
2007/03/08 Javascript
List Installed Software Features
2007/06/11 Javascript
JS 各种网页尺寸判断实例方法
2013/04/18 Javascript
jQuery 关于伪类选择符的使用说明
2013/04/24 Javascript
判定是否原生方法的JS代码
2013/11/12 Javascript
jquery实现弹出层完美居中效果
2014/03/03 Javascript
jquery动态调整div大小使其宽度始终为浏览器宽度
2014/06/06 Javascript
JQuery.validate在ie8下不支持的快速解决方法
2016/05/18 Javascript
jquery 判断selection range 是否在容器中的简单实例
2016/08/02 Javascript
jQuery Pagination分页插件使用方法详解
2017/02/28 Javascript
详解Vue路由开启keep-alive时的注意点
2017/06/20 Javascript
JavaScript正则表达式校验与递归函数实际应用实例解析
2017/08/04 Javascript
AngularJS实现与后台服务器进行交互的示例讲解
2018/08/13 Javascript
vue element-ui实现input输入框金额数字添加千分位
2019/12/29 Javascript
js实现页面图片消除效果
2020/03/24 Javascript
[01:03:09]完美世界DOTA2联赛PWL S2 Forest vs SZ 第二场 11.25
2020/11/26 DOTA
Python入门_浅谈逻辑判断与运算符
2017/05/16 Python
老生常谈进程线程协程那些事儿
2017/07/24 Python
对tensorflow 的模型保存和调用实例讲解
2018/07/28 Python
Jupyter notebook在mac:linux上的配置和远程访问的方法
2019/01/14 Python
Keras Convolution1D与Convolution2D区别说明
2020/05/22 Python
Python制作简单的剪刀石头布游戏
2020/12/10 Python
html5 利用重力感应实现摇一摇换颜色可用来做抽奖等等
2014/05/07 HTML / CSS
探索欧洲最好的品牌:Bombinate
2019/06/14 全球购物
五年级英语教学反思
2014/01/31 职场文书
竞选部门副经理的自荐书范文
2014/02/11 职场文书
2014年个人工作总结报告
2014/11/27 职场文书
水电工程师岗位职责
2015/02/13 职场文书
2015年社区中秋节活动总结
2015/03/23 职场文书
反四风问题学习心得体会
2016/01/22 职场文书
公文格式,规则明细(新手收藏)
2019/07/23 职场文书
一文搞懂redux在react中的初步用法
2021/06/09 Javascript
python Django框架快速入门教程(后台管理)
2021/07/21 Python