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 相关文章推荐
可缩放Reloaded-一个针对可缩放元素的复用组件
Mar 10 Javascript
JQuery为页面Dom元素绑定事件及解除绑定方法
Apr 23 Javascript
手机端网页点击链接触发自动拨打或保存电话的示例代码
Aug 15 Javascript
JavaScript中诡异的delete操作符
Mar 12 Javascript
javascript实现俄罗斯方块游戏的思路和方法
Apr 27 Javascript
javascript实现的固定位置悬浮窗口实例
Apr 30 Javascript
AngularJS基础 ng-keydown 指令简单示例
Aug 02 Javascript
JavaScript中匿名函数的递归调用
Jan 22 Javascript
JS实现DIV高度自适应窗口示例
Feb 16 Javascript
Bootstrap 3 进度条的实现
Feb 22 Javascript
动态加载、移除js/css文件的示例代码
Mar 20 Javascript
微信小程序之高德地图多点路线规划过程示例详解
Jan 18 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连接Oracle for NT 远程数据库
2006/10/09 PHP
php通过exif_read_data函数获取图片的exif信息
2015/05/21 PHP
php中文验证码实现方法
2015/06/18 PHP
PHP自定义错误用法示例
2016/09/28 PHP
php实现微信原生支付(扫码支付)功能
2018/05/30 PHP
js将long日期格式转换为标准日期格式实现思路
2013/04/07 Javascript
jQuery基础语法实例入门
2014/12/23 Javascript
js中this用法实例详解
2015/05/05 Javascript
浅析AngularJS中的生命周期和延迟处理
2015/06/18 Javascript
原生JS实现拖拽图片效果
2020/08/27 Javascript
Bootstrap每天必学之工具提示(Tooltip)插件
2016/04/26 Javascript
js中获取键盘事件的简单实现方法
2016/10/10 Javascript
微信小程序 聊天室简单实现
2017/04/19 Javascript
javascript实现延时显示提示框效果
2017/06/01 Javascript
JavaScript继承定义与用法实践分析
2018/05/28 Javascript
Vue.js组件通信之自定义事件详解
2019/10/19 Javascript
vue搜索页开发实例代码详解(热门搜索,历史搜索,淘宝接口演示)
2020/04/11 Javascript
[32:39]完美世界DOTA2联赛循环赛 Forest vs Inki BO2第一场 11.04
2020/11/04 DOTA
实例讲解Python编程中@property装饰器的用法
2016/06/20 Python
Python3 itchat实现微信定时发送群消息的实例代码
2019/07/12 Python
python实现比对美团接口返回数据和本地mongo数据是否一致示例
2019/08/09 Python
手把手教你将Flask应用封装成Docker服务的实现
2020/08/19 Python
突袭HTML5之Javascript API扩展4—拖拽(Drag/Drop)概述
2013/01/31 HTML / CSS
Ralph Lauren法国官网:美国高品味时装品牌
2017/12/08 全球购物
L’urv官网:精品女性运动服品牌
2019/07/07 全球购物
法国滑雪假期的专家:Ski Planet
2019/11/02 全球购物
俄罗斯游戏商店:Buka
2020/03/01 全球购物
数控机械专业个人的自我评价
2014/01/02 职场文书
优秀大学生的自我评价
2014/01/16 职场文书
幼儿园教学管理制度
2014/02/04 职场文书
美术毕业生求职信
2014/02/25 职场文书
烹饪自我鉴定
2014/03/01 职场文书
应届毕业生求职信范文
2014/05/08 职场文书
门卫岗位职责说明书
2014/08/18 职场文书
2015年党员个人工作总结
2015/05/13 职场文书
Spring JPA 增加字段执行异常问题及解决
2022/06/10 Java/Android