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 相关文章推荐
ASP中用Join和Array,可以加快字符连接速度的代码
Aug 22 Javascript
jQuery开发者都需要知道的5个小技巧
Jan 08 Javascript
C#中TrimStart,TrimEnd,Trim在javascript上的实现
Jan 17 Javascript
用js获取电脑信息(是使用与IE浏览器)
Jan 15 Javascript
js实现连个数字相加而不是拼接的方法
Feb 23 Javascript
iScroll中事件点击触发两次解决方案
Mar 11 Javascript
bootstrap vue.js实现tab效果
Feb 07 Javascript
基于HTML5+JS实现本地图片裁剪并上传功能
Mar 24 Javascript
Bootstrap Table使用整理(二)
Jun 09 Javascript
详解webpack提取第三方库的正确姿势
Dec 22 Javascript
微信小程序实现图片预览功能
Jan 31 Javascript
JS co 函数库的含义和用法实例总结
Apr 08 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
中国站长站 For Dede4.0 采集规则
2007/05/27 PHP
php实现redis数据库指定库号迁移的方法
2015/01/14 PHP
php实现批量删除挂马文件及批量替换页面内容完整实例
2016/07/08 PHP
php5.x禁用eval的操作方法
2018/10/19 PHP
javascript写的日历类(基于pj)
2010/12/28 Javascript
利用谷歌地图API获取点与点的距离的js代码
2012/10/11 Javascript
JS文本框不能输入空格验证方法
2013/03/19 Javascript
JQGrid的用法解析(列编辑,添加行,删除行)
2013/11/08 Javascript
js和css写一个可以自动隐藏的悬浮框
2014/03/05 Javascript
两种方法基于jQuery实现IE浏览器兼容placeholder效果
2014/10/14 Javascript
原生js和jQuery随意改变div属性style的名称和值
2014/10/22 Javascript
jQuery ajax时间差导致的变量赋值问题分析
2016/01/22 Javascript
Node.js 条形码识别程序构建思路详解
2016/02/14 Javascript
jQuery根据name属性进行查找的用法分析
2016/06/23 Javascript
Bootstrap CSS组件之下拉菜单(dropdown)
2016/12/17 Javascript
微信小程序的授权实现过程解析
2019/08/02 Javascript
three.js显示中文字体与tween应用详析
2021/01/04 Javascript
[04:53]DOTA2英雄基础教程 祈求者
2014/01/03 DOTA
[04:11]2014DOTA2国际邀请赛 CIS遗憾出局梦想不灭
2014/07/09 DOTA
[01:09]DOTA2次级职业联赛 - 99战队宣传片
2014/12/01 DOTA
Python基于lxml模块解析html获取页面内所有叶子节点xpath路径功能示例
2018/05/16 Python
pandas数据清洗,排序,索引设置,数据选取方法
2018/05/18 Python
Opencv+Python实现图像运动模糊和高斯模糊的示例
2019/04/11 Python
解决Pyinstaller 打包exe文件 取消dos窗口(黑框框)的问题
2019/06/21 Python
Python Selenium参数配置方法解析
2020/01/19 Python
python使用pandas抽样训练数据中某个类别实例
2020/02/28 Python
基于keras中的回调函数用法说明
2020/06/17 Python
详解Python中第三方库Faker
2020/09/25 Python
HTML5 新旧语法标记对我们有什么好处
2012/12/13 HTML / CSS
美国时尚大码女装购物网站:Avenue
2019/05/24 全球购物
联想阿根廷官方网站:Lenovo Argentina
2019/10/14 全球购物
英语教师岗位职责
2014/03/16 职场文书
运动会开幕式主持词
2014/03/28 职场文书
俞敏洪北大演讲稿
2014/05/22 职场文书
安全员岗位职责
2015/02/10 职场文书
修改并编译golang源码的操作步骤
2021/07/25 Golang