这篇文章主要介绍了javascript数组去重终极总结,本文列举了3种javascript数组去重方法,并分别分析了它们的优缺点,需要的朋友可以参考下

有时会碰上这种需求,需要将数组中重复的元素删除掉,而只保留一个。最先想到的办法很可能就是用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 方法在各浏览器中的算法应该也有区别。

最新资讯
疫情带动“宅”经济 彩电行业迭代升级提速

疫情带动“宅”经济

对于彩电行业来说,新型冠状病毒感染的肺炎疫情除了对其
蔚来汽车资金“迷局”:遭高瓴清仓 传吉利入股

蔚来汽车资金“迷局”

作为造车新势力的头部玩家,蔚来汽车在资本市场的频频动
特斯拉“单挑”电池巨头:强势买方的超级野心

特斯拉“单挑”电池巨

上海工厂投产后,特斯拉的动力电池供应链终于开始真正地
疫情“压裂”蛋壳  高速扩张带来的隐与忧

疫情“压裂”蛋壳 高

连日来,长租公寓蛋壳、自如在多个城市遭房东、租客双重
采用无钴电池即磷酸铁锂电池?特斯拉说不一定

采用无钴电池即磷酸铁

2月21日,特斯拉表示:”请留意四月特斯拉的电池发布会,无
MWC大会被取消 主办方GSMA称不向参展商退费

MWC大会被取消 主办方

据国外媒体报道,2020年“世界移动通信大会”(MWC)主办方
最新文章
Vue实现图片与文字混输效果

Vue实现图片与文字混

用多了 JQuery ,习惯了使用JQuery的API操作 DOM ,几乎忘
Vue实现点击当前元素以外的地方隐藏当前元素(实现思路)

Vue实现点击当前元素

这篇文章主要介绍了Vue实现点击当前元素以外的地方隐
Vue实现验证码功能

Vue实现验证码功能

这篇文章主要为大家详细介绍了Vue实现验证码功能,文中
JS实现的雪花飘落特效示例

JS实现的雪花飘落特效

这篇文章主要介绍了JS实现的雪花飘落特效,结合实例形
微信小程序实现图片压缩

微信小程序实现图片压

这篇文章主要为大家详细介绍了微信小程序实现图片压缩
JavaScript实现京东放大镜效果

JavaScript实现京东放

这篇文章主要为大家详细介绍了JavaScript实现京东放大