JS中数组去重的几个方法
2020-4-9
456

最近在无意在网上找到了一波培训机构的教程视频,虽然有些内容之前看书有印象,但是说实话,看书实在是太烧脑了,而且很多东西都一知半解的。正好看了一些视频,对之前书上看过的内容又复习了一遍,而且也很有收获。

今天要记录的是关于数组中去重的方法。数组去重的方法其实还有很多,所以就选了几种记录一下。

去除数组中的重复项

方法一
var ary = [1,2,2,3,4,2,1,3,4,4,2];
for (var i=0;i<ary.length-1;i++){
  var cur = ary[i];
  for(var j=i+1;j<ary.length;j++){
  if(cur===ary[j]){
         ary.splice(j,1)
         j--;
       }
    }
}

该方法是用点前项与后面的每一项比较,发现有重复项,就删除当前重复项。

方法二
var ary = [1,2,2,3,4,2,1,3,4,4,2];
var obj={};
for(var i=0;i<ary.length;i++){
  var cur = ary[i];
  if(typeof obj[cur]!=='undefined'){
      ary.splice(i,1);
      i--;
      continue;
    }
  obj[cur]=cur;
}

该方法使用数组的键值,定义一个对象,把当前数组的值作为属性名,数组的值作为该属性的属性值存在obj这个对象里面,然后不断往这个对象用该方法添加属性,但是在添加前会检测该对象里面是否含有该属性,假如有则删除这个值。该方法使用时有一个注意点,使用splice会导致后面的索引向前进以为,所以删除相同的数后,我们需要i--;才能保证不会让进一位的这个数调过检测,同时,如果后面有很多项,会消耗很大的性能

方法三
var ary = [1,2,2,3,4,2,1,3,4,4,2];
var obj={};
for(var i=0;i<ary.length;i++){
  var cur = ary[i];
  if(typeof obj[cur]!=='undefined'){
      ary[i]=ary[ary.length-1]; //把数组最后一项拿过来替代当前要删除的项
      i--;
      ary.length--;  //把数组最后一项删除
      continue;
    }
  obj[cur]=cur;
}

该方法可以优化上面那个方法的问题,可以减少性能的损耗

方法四

对于数组去重,我们可以给数组定义一个属性,如下

Array.prototype.myUnique = function myUnique(){
 var obj ={};
 for(var i=0;i<this.length;i++){
  var item = this[i];
  if(typeof obj[item]!=='undefined'){
  this[i]=this[this.length-1];
  this.length--;
  i--;
  continue;
}
  obj[item]=item;

}
  obj=null;  //obj只是一个临时存储对象,为了优化内存应该把它清空
  return this;
}

注意:方法二、三、四都有一个问题,数组里面不能含有"undefined"和对象,undefined很好理解,如果有对象,对象左右对象名换转换为"[object object]",这样会导致数组里面的对象都会被移除,只留下最后一组对象

方法五
var ary = [1,2,2,3,4,2,1,3,4,4,2];
ary = Array.from(new Set(ary))
console.log(ary)   //=>[1,2,3,4]