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 相关文章推荐
判断多个元素(RADIO,CHECKBOX等)是否被选择的原理说明
Feb 18 Javascript
javascript控制frame,iframe的src属性代码
Dec 31 Javascript
JavaScript 一道字符串分解的题目
Aug 03 Javascript
jQuery实现单击按钮遮罩弹出对话框(仿天猫的删除对话框)
Apr 10 Javascript
jquery实现上下左右滑动的方法
Feb 09 Javascript
javascript中caller和callee详解
Aug 10 Javascript
对于jQuery性能的一些优化建议
Aug 13 Javascript
JavaScript中的跨浏览器事件操作的基本方法整理
May 20 Javascript
AngularJs Dependency Injection(DI,依赖注入)
Sep 02 Javascript
学习vue.js表单控件绑定操作
Dec 05 Javascript
jQuery源码解读之extend()与工具方法、实例方法详解
Mar 30 jQuery
js中Generator函数的深入讲解
Apr 07 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
Http 1.1 Etag 与 Last-Modified提高php效率
2008/01/10 PHP
php Undefined index和Undefined variable的解决方法
2008/03/27 PHP
php获取字段名示例分享
2014/03/03 PHP
php中smarty区域循环的方法
2015/06/11 PHP
ThinkPHP 3.2.3实现加减乘除图片验证码
2018/12/05 PHP
PhpStorm连接服务器并实现自动上传功能
2020/12/09 PHP
Javascript-Mozilla和IE中的一个函数直接量的问题分析
2007/08/12 Javascript
cookie.js 加载顺序问题怎么才有效
2013/07/31 Javascript
javascript正则匹配汉字、数字、字母、下划线
2014/04/10 Javascript
javascript实现的HashMap类代码
2014/06/27 Javascript
JavaScript实现select添加option
2015/07/03 Javascript
数据分析软件之FineReport教程:[5]参数界面JS(全)
2015/08/13 Javascript
使用JQuery在线制作ppt并在线演示源码特效
2015/09/08 Javascript
JS组件Bootstrap dropdown组件扩展hover事件
2016/04/17 Javascript
前端框架Vue.js中Directive知识详解
2016/09/12 Javascript
javascript replace()第二个参数为函数时的参数用法
2016/12/26 Javascript
js实现前端分页页码管理
2017/01/06 Javascript
Angular5集成eventbus的示例代码
2018/07/19 Javascript
Webpack4+Babel7+ES6兼容IE8的实现
2019/04/10 Javascript
vue+eslint+vscode配置教程
2019/08/09 Javascript
vue项目实现多语言切换的思路
2020/09/17 Javascript
[46:21]Liquid vs LGD 2018国际邀请赛淘汰赛BO3 第一场 8.23
2018/08/24 DOTA
编程语言Python的发展史
2014/09/26 Python
python操作ie登陆土豆网的方法
2015/05/09 Python
Python对列表去重的多种方法(四种方法)
2017/12/05 Python
Python 从相对路径下import的方法
2018/12/04 Python
学生信息管理系统Python面向对象版
2019/01/30 Python
解决Pytorch自定义层出现多Variable共享内存错误问题
2020/06/28 Python
Python远程方法调用实现过程解析
2020/07/28 Python
TripAdvisor印尼站:全球领先的旅游网站
2018/03/15 全球购物
运动会获奖感言
2014/02/11 职场文书
干部年终考核评语
2015/01/04 职场文书
学术会议邀请函
2015/01/30 职场文书
公司档案管理制度
2015/08/05 职场文书
廉政党课工作报告案例
2019/06/21 职场文书
mysql数据插入覆盖和时间戳的问题及解决
2022/03/25 MySQL