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的语法,新东西会存在浏览器的兼容问题,所以,在使用前,先看看您项目的兼容范围吧!

posted @ 2017-04-24 17:37  疾风_剑豪  阅读(109)  评论(0编辑  收藏  举报