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 加入收藏夹的代码(主流浏览器通用)
May 13 Javascript
JavaScript知识点总结(十)之this关键字
May 31 Javascript
检查表单元素的值是否为空的实例代码
Jun 16 Javascript
jQuery将表单序列化成一个Object对象的实例
Nov 29 Javascript
JS操作input标签属性checkbox全选的实现代码
Mar 02 Javascript
详解vue-router传参的两种方式
Sep 10 Javascript
js 计算图片内点个数的示例代码
Apr 04 Javascript
小程序rich-text组件如何改变内部img图片样式的方法
May 22 Javascript
JS使用H5实现图片预览功能
Sep 30 Javascript
微信小程序地图绘制线段并且测量(实例代码)
Jan 02 Javascript
如何利用Node.js与JSON搭建简单的动态服务器
Jun 16 Javascript
jQuery实现移动端扭蛋机抽奖
Nov 08 jQuery
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中遇到BOM、编码导致json_decode函数无法解析问题
2014/07/02 PHP
php实现通过soap调用.Net的WebService asmx文件
2017/02/27 PHP
多个Laravel项目如何共用migrations详解
2018/09/25 PHP
利用jquery操作select下拉列表框的代码
2010/06/04 Javascript
JavaScript的函数式编程基础指南
2016/03/19 Javascript
jQuery Easyui DataGrid点击某个单元格即进入编辑状态焦点移开后保存数据
2016/08/15 Javascript
AngularJs IE Compatibility 兼容老版本IE
2016/09/01 Javascript
纯JS打造网页中checkbox和radio的美化效果
2016/10/13 Javascript
node.js Sequelize实现单实例字段或批量自增、自减
2016/12/08 Javascript
Cropper.js 实现裁剪图片并上传(PC端)
2017/08/20 Javascript
vue2里面ref的具体使用方法
2017/10/27 Javascript
微信小程序点击列表跳转到对应详情页过程解析
2019/09/26 Javascript
js实现蒙版效果
2020/01/11 Javascript
Vue Elenent实现表格相同数据列合并
2020/11/30 Vue.js
一键搞定python连接mysql驱动有关问题(windows版本)
2016/04/23 Python
python去除字符串中的换行符
2017/10/11 Python
python按行读取文件,去掉每行的换行符\n的实例
2018/04/19 Python
利用Python如何生成便签图片详解
2018/07/09 Python
django项目环境搭建及在虚拟机本地创建django项目的教程
2019/08/02 Python
Python使用selenium + headless chrome获取网页内容的方法示例
2019/10/16 Python
详解python破解zip文件密码的方法
2020/01/13 Python
python入门之基础语法学习笔记
2020/02/08 Python
tensorflow实现训练变量checkpoint的保存与读取
2020/02/10 Python
解决Keras使用GPU资源耗尽的问题
2020/06/22 Python
浅谈html5之sse服务器发送事件EventSource介绍
2017/08/28 HTML / CSS
台湾母婴用品购物网站:Infant婴之房
2018/06/15 全球购物
改变生活的男士内衣:SAXX Underwear
2019/08/28 全球购物
俄罗斯电子产品、计算机和家用电器购物网站:OLDI
2019/10/27 全球购物
大学生职业生涯规划范文
2013/12/31 职场文书
八一建军节部队活动方案
2014/02/04 职场文书
县委党的群众路线教育实践活动工作情况报告
2014/10/25 职场文书
2014年维稳工作总结
2014/11/18 职场文书
复兴之路观后感3000字
2015/06/02 职场文书
数学复习课教学反思
2016/02/18 职场文书
高一作文之乐趣
2019/11/21 职场文书
vue项目多环境配置(.env)的实现
2021/07/21 Vue.js