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 Excel读取和写入操作(模板操作)实现代码
Apr 11 Javascript
10款新鲜出炉的 jQuery 插件(Ajax 插件,有幻灯片、图片画廊、菜单等)
Jun 08 Javascript
JS与jQuery遍历Table所有单元格内容的方法
Dec 07 Javascript
BootstrapValidator不触发校验的实现代码
Sep 28 Javascript
JavaScript数组和对象的复制
Mar 21 Javascript
vue2.0实现倒计时的插件(时间戳 刷新 跳转 都不影响)
Mar 30 Javascript
微信小程序动态显示项目倒计时效果
Jun 13 Javascript
Node.js pipe实现源码解析
Aug 12 Javascript
Vue 项目部署到服务器的问题解决方法
Dec 05 Javascript
JavaScript使用享元模式实现文件上传优化操作示例
Aug 07 Javascript
一起写一个即插即用的Vue Loading插件实现
Oct 31 Javascript
vue 自定义组件添加原生事件
Apr 21 Vue.js
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中的正规表达式(一)
2006/10/09 PHP
php生成验证码函数
2015/10/20 PHP
php求数组全排列,元素所有组合的方法
2016/05/05 PHP
PHP环境搭建的详细步骤
2016/06/30 PHP
php实现的http请求封装示例
2016/11/08 PHP
laravel 5异常错误:FatalErrorException in Handler.php line 38的解决
2017/10/12 PHP
解决Laravel 不能创建 migration 的问题
2019/10/09 PHP
关于Blog顶部的滚动导航条代码
2006/09/25 Javascript
Grid得到选择行数据的方法总结
2011/01/17 Javascript
jQuery实现页面滚动时层智能浮动定位实例探讨
2013/03/29 Javascript
jquery validate添加自定义验证规则(验证邮箱 邮政编码)
2013/12/04 Javascript
javascript内置对象操作详解
2015/02/04 Javascript
javascript中定义类的方法详解
2015/02/10 Javascript
基于jquery实现全屏滚动效果
2015/11/26 Javascript
简单理解js的prototype属性及使用
2016/12/07 Javascript
BOM之navigator对象和用户代理检测
2017/02/10 Javascript
详解基于node的前端项目编译时内存溢出问题
2017/08/01 Javascript
element-ui 表格实现单元格可编辑的示例
2018/02/26 Javascript
vue中element 上传功能的实现思路
2018/07/06 Javascript
JavaScript中的this原理及6种常见使用场景详解
2020/02/14 Javascript
nuxt.js添加环境变量,区分项目打包环境操作
2020/11/06 Javascript
vue项目中使用rem,在入口文件添加内容操作
2020/11/11 Javascript
pycharm 使用心得(八)如何调用另一文件中的函数
2014/06/06 Python
在Django中创建动态视图的教程
2015/07/15 Python
python下实现二叉堆以及堆排序的示例
2017/09/29 Python
Python实现的KMeans聚类算法实例分析
2018/12/29 Python
利用Django提供的ModelForm增删改数据的方法
2019/01/06 Python
css3中background新增的4个新的相关属性用法介绍
2013/09/26 HTML / CSS
Perry Ellis官网:美国男士品味服装
2016/12/09 全球购物
远程调用的原理
2014/07/05 面试题
门卫岗位安全职责
2013/12/13 职场文书
外企办公室竞聘演讲稿
2013/12/29 职场文书
房地产置业顾问岗位职责
2015/04/11 职场文书
工资证明格式模板
2015/06/12 职场文书
2016计算机专业毕业生自荐信
2016/01/28 职场文书
Python中快速掌握Data Frame的常用操作
2021/03/31 Python