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下用eval生成JSON对象
Sep 17 Javascript
jquery中EasyUI实现同步树
Mar 01 Javascript
jQuery判断多个input file 都不能为空的例子
Jun 23 Javascript
JavaScript模拟实现键盘打字效果
Jun 29 Javascript
DEDECMS如何为文章添加HOT NEW标志图片
Aug 14 Javascript
confirm确认对话框的实现方法总结
Jun 17 Javascript
原生ajax处理json格式数据的实例代码
Dec 25 Javascript
vue.js,ajax渲染页面的实例
Feb 11 Javascript
JQuery Ajax动态加载Table数据的实例讲解
Aug 09 jQuery
vue发送ajax请求详解
Oct 09 Javascript
Vue动态修改网页标题的方法及遇到问题
Jun 09 Javascript
vue移动端使用appClound拉起支付宝支付的实现方法
Nov 21 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生成的html meta和link标记在body标签里 顶部有个空行
2010/05/18 PHP
php中 $$str 中 &quot;$$&quot; 的详解
2015/07/06 PHP
MAC下通过改apache配置文件切换php多版本的方法
2017/04/26 PHP
详解提高使用Java反射的效率方法
2019/04/29 PHP
javascript 语法基础 想学习js的朋友可以看看
2009/12/16 Javascript
前端开发的开始---基于面向对象的Ajax类
2010/09/17 Javascript
jQuery 鼠标经过(hover)事件的延时处理示例
2014/04/14 Javascript
JQuery中两个ul标签的li互相移动实现方法
2015/05/18 Javascript
原生JavaScript实现Ajax的方法
2016/04/07 Javascript
canvas实现图像放大镜
2017/02/06 Javascript
JS实现简单拖拽效果
2017/06/21 Javascript
vue项目刷新当前页面的三种方法
2018/12/04 Javascript
nvm、nrm、npm 安装和使用详解(小结)
2019/01/17 Javascript
详解VScode编辑器vue环境搭建所遇问题解决方案
2019/04/26 Javascript
Vue formData实现图片上传
2019/08/20 Javascript
layui自己添加图片按钮并点击跳转页面的例子
2019/09/14 Javascript
[18:20]DOTA2 HEROS教学视频教你分分钟做大人-昆卡
2014/06/11 DOTA
python中requests模块的使用方法
2015/04/08 Python
Python重新加载模块的实现方法
2018/10/16 Python
Python实现蒙特卡洛算法小实验过程详解
2019/07/12 Python
Python使用python-docx读写word文档
2019/08/26 Python
Uber Eats台湾:寻找附近提供送餐服务的餐厅
2018/05/07 全球购物
KENZO官网:高田贤三在法国创立的品牌
2019/05/16 全球购物
法国体育用品商店:GO Sport
2019/10/23 全球购物
文件中有一组整数,要求排序后输出到另一个文件中
2012/01/04 面试题
自我评价优秀范文分享
2013/11/30 职场文书
怎样客观的做好自我评价
2013/12/28 职场文书
大型会议接待方案
2014/03/01 职场文书
工艺工程师岗位职责
2014/03/04 职场文书
保护环境建议书300字
2014/05/13 职场文书
投资公司董事长岗位职责
2015/04/16 职场文书
学校德育工作总结2015
2015/05/11 职场文书
详解Javascript实践中的命令模式
2021/05/05 Javascript
Python列表删除重复元素与图像相似度判断及删除实例代码
2021/05/07 Python
MySQL主从搭建(多主一从)的实现思路与步骤
2021/05/13 MySQL
MYSQL 运算符总结
2021/11/11 MySQL