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中sort()方法的用法
Nov 04 Javascript
Javascript匿名函数的一种应用 代码封装
Jun 27 Javascript
重写javascript中window.confirm的行为
Oct 21 Javascript
禁止你的左键复制实用技巧
Jan 04 Javascript
jquery实现控制表格行高亮实例
Jun 05 Javascript
jquery购物车实时结算特效实现思路
Sep 23 Javascript
js实现下拉列表选中某个值的方法(3种方法)
Dec 17 Javascript
学习JavaScript设计模式之装饰者模式
Jan 19 Javascript
解决vue-cli中stylus无法使用的问题方法
Jun 19 Javascript
vue数据初始化initState的实例详解
Apr 11 Javascript
记录微信小程序 height: calc(xx - xx);无效问题
Dec 30 Javascript
JavaScript实现轮播图特效
Apr 10 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计算函数执行时间的方法
2015/03/20 PHP
详解Yii2 定制表单输入字段的标签和样式
2017/01/04 PHP
用javascript获得地址栏参数的两种方法
2006/11/08 Javascript
关于IE7 IE8弹出窗口顶上
2008/12/22 Javascript
JavaScript中的操作符==与===介绍
2014/12/31 Javascript
浅谈Nodejs观察者模式
2015/10/13 NodeJs
Node.js DES加密的简单实现
2016/07/07 Javascript
javascript中Date对象的使用总结
2016/11/21 Javascript
js实现的简练高效拖拽功能示例
2016/12/21 Javascript
BootStrap栅格系统、表单样式与按钮样式源码解析
2017/01/20 Javascript
JS实现数组去重方法总结(六种方法)
2017/07/14 Javascript
关于vue-router的beforeEach无限循环的问题解决
2017/09/09 Javascript
JavaScript运行原理分析
2018/02/09 Javascript
webpack本地开发环境无法用IP访问的解决方法
2018/03/20 Javascript
JavaScript实现京东购物放大镜和选项卡效果的方法分析
2018/07/05 Javascript
浅谈JavaScript 代码简洁之道
2019/01/09 Javascript
原生javascript运动函数的封装示例【匀速、抛物线、多属性的运动等】
2020/02/23 Javascript
Vue实现鼠标经过文字显示悬浮框效果的示例代码
2020/10/14 Javascript
[02:25]DOTA2英雄基础教程 虚空假面
2014/01/02 DOTA
Pycharm编辑器技巧之自动导入模块详解
2017/07/18 Python
python 对象和json互相转换方法
2018/03/22 Python
python读取excel指定列数据并写入到新的excel方法
2018/07/10 Python
python 含子图的gif生成时内存溢出的方法
2019/07/07 Python
使用Python和Scribus创建一个RGB立方体的方法
2019/07/17 Python
python操作gitlab API过程解析
2019/12/27 Python
新手学习Python2和Python3中print不同的用法
2020/06/09 Python
Python collections.defaultdict模块用法详解
2020/06/18 Python
python3处理word文档实例分析
2020/12/01 Python
python 根据列表批量下载网易云音乐的免费音乐
2020/12/03 Python
西班牙美妆电商:Perfume’s Club(有中文站)
2018/08/08 全球购物
英国领先的餐饮折扣俱乐部:Gourmet Society
2020/07/26 全球购物
服装设计专业自荐书范文
2013/12/30 职场文书
迟到检讨书大全
2014/01/25 职场文书
新店开业策划方案怎么书写?
2019/07/05 职场文书
python在package下继续嵌套一个package
2022/04/14 Python
vue @click.native 绑定原生点击事件
2022/04/22 Vue.js