js数组去重
js数组去重
这个问题我觉得面试问道的概率非常大,就目前我这个阶段而言哦,对于技术特别好的人,毕竟没到那个水准,不知道面的是什么,反正我面的公司一般都会问。
js数组去重就我而言,我只知道三种,下面为大家列出
1.
Array.prototype.array1 = function() {
var res = [this[0]];
for (var i = 1; i < this.length; i++) {
var repeat = false;
for (var j = 0; j < res.length; j++) {
if (this[i] == res[j]) {
repeat = true;
break;
}
}
if (!repeat) {
res.push(this[i]);
}
}
return res;
}
var arr = [1, 'a', 'a', 'b', 'd', 'e', 'e', 1, 0]
alert(arr.array1());
这种方法实现原理是:构建一个新的数组存放结果,for循环中每次从原数组中取出一个元素,用这个元素循环与结果数组对比,若结果数组中没有该元素,则存到结果数组中
2.
Array.prototype.array2= function() {
this.sort(); //先排序
var res = [this[0]];
for (var i = 1; i < this.length; i++) {
if (this[i] !== res[res.length - 1]) {
res.push(this[i]);
}
}
return res;
}
var arr = [1, 'a', 'a', 'b', 'd', 'e', 'e', 1, 0]
alert(arr.array2());
这种方法实现原理是:先将原数组进行排序,检查原数组中的第i个元素 与 结果数组中的最后一个元素是否相同,因为已经排序,所以重复元素会在相邻位置,如果不相同,则将该元素存入结果数组中
3.
Array.prototype.array3= function(){
var res = [];
var json = {};
for(var i = 0; i < this.length; i++){
if(!json[this[i]]){
res.push(this[i]);
json[this[i]] = 1;
}
}
return res;
}
var arr = [1, 'a', 'a', 'b', 'd', 'e', 'e', 1, 0];
alert(arr.array3());
这种方法实现原理是:创建一个新的数组存放结果,创建一个空对象,for循环时,每次取出一个元素与对象进行对比,如果这个元素不重复,则把它存放到结果数组中,同时把这个元素的内容作为对象的一个属性,并赋值为1,存入到第2步建立的对象中
第三种方法是本人推荐使用的,相对其他几种,效率会高很多。有其他方法可以实现的话,欢迎补充。
<--------------------------------------------------分割线---------------------------------------------------------------->
我又想到方法,来补充一下
ES6里新添加了两个很好用的东西,set和Array.from。
set是一种新的数据结构,它可以接收一个数组或者是类数组对象,自动去重其中的重复项目。
比如我们现在有个数组var arr = [1,1,2,2,3,3,4,4,'5','5']
我们在控制台用Set输出一下
console.log(new Set(arr))
在这我们可以看见,重复的项已经被去掉了,在上图中发现,咦,set输出的是一个对象啊,但是我们有时候想得到一个数组,那怎么办。
前边我说了es6添加了两个好东西,还有个没说呢,那就是Array.from。它的作用,就是可以把类数组对象、可迭代对象转化为数组。
还是刚刚那个数组arr,我们用Array.from来试试,看下输出的是个神马东东。
这样数组去重,是不是比以前我们写的那些简单多了呢。
这是es6的语法,新东西会存在浏览器的兼容问题,所以,在使用前,先看看您项目的兼容范围吧!