JS---算法之数组去重

一、方法一

【简单思路实现】

        依次拿出数组的中的每一项,和后面的所有项进行比较,如果有相同的就删除。

示例代码

var ary=[1,2,3,2,4];
/* 
思路:
第一次:
   拿出数组的第一项:1
                 给[2,3,2,4]进行比较,如果有重复就删除
   拿出数组的第二项:2   
                   ====[3,2,4]进行比较,有重复的删除 [3,4]  
   拿出数组的第三项:3
                   ===4 进行比较,有重复的删除,没有重复
   还用拿最后一项4吗?====不用了                                     
依次拿出数组中的每一项给剩余的所有项进行比较

*/
function unique(ary){
    for(var i=0;i<ary.length-1;i++){
        var getItem=ary[i];
        for(var j=i+1;j<ary.length;j++){
           var remainItem=ary[j];
           // 如果当前项和后面的项在进行比较的时候,相同就说明重复,要删除掉原数组的那项
           if(getItem==remainItem){
              ary.splice(j,1);//此处splice会出现数组塌陷
//在本循环中,出现了相同项,删除后,后面的项会向前移动,但此时的j++,仍然增加,就会跳过前进的哪一项,造成数组塌陷
              j--;
           }
        }
   }
   return ary;
}

console.log(unique(ary));

二、方法二

【实现的思路】

        利用对象属性名不重复的思想,先建立一个空对象,然后依次循环数组中的每一项,把此项作为obj对象的属性名和属性值,在添加的时候,如果这个属性名对应的值已经存在,说明此项重复,删除掉此项。

示例代码

/* 
var ary2=[1,2,1,3,3,2,3];

利用对象属性名不能重复的原理:对象中如果没有一个属性的时候就是undefined
把数组中的每一项作为一个对象的属性名和属性值
var obj={1:1,2:2,3:3} 
原理:如果对象属性中已经存在这个属性名,我们就把原数组中此项进行删除
*/
function unique(ary){
   var obj={};
   for(var i=0;i<ary.length;i++){
       var item=ary[i];
       if(typeof (obj[item])!="undefined"){
         //如果此时对象的此属性已经有了,我们就应该删除数组中的那一项
         ary.splice(i,1);
         i--;
         continue;
       }
       obj[item]=item;
   }
   return ary;
}

var ary2=[1,2,1,3,3,2,3];
var res=unique(ary2);
console.log(res);

此种方法,仍然会出现数组塌陷的问题。

对于数组塌陷,数组中后面所有的数字都要依次改变,这样比较耗性能,

【优化方法】:可以让后面的索引值不变,这样就可以省性能。

  • 把最后一项的值拿过来,占位到塌陷的此项
  • 把最后一项删除
  • 需要注意,此时最后一项也需要比较所以还需要i--

 优化后代码

var ary=[1,2,3,2,3];
var obj={};

for(var i=0;i<ary.length;i++){
   var item=ary[i];
   if(typeof obj[item]!=="undefined"){
        // 把当前重复的项替换成最后一项
        ary[i]=ary[ary.length-1];
        // 最后一项都已经拿过来了,多余,所以删除掉
        ary.length--;
        // 此时占位的这一项(最后一项)还没有比较,所以需要i--,再重新比较一次
        i--;
        continue;
   }
   obj[item]=item;
}

console.log(ary);

三、方法三:indexOf

 【实现的思路】

创建一个新数组,遍历原数组,如果新数组中没有那一项的话,就把它push进去.

示例代码

/* 
  var ary2=[1,2,1,3,3,2,3];
  var newAry=[];
  把原数组中的每一项,只要在新数组中没存在过,我们就把它放进去,最后newAry就是咱们最终要的数组
*/

function unique(ary){
   var newAry=[];
   for(var i=0;i<ary.length;i++){
       var item=ary[i];
       if(newAry.indexOf(item)==-1){
        newAry.push(item);
       }
   }
   return newAry;
}
var ary2=[1,2,1,3,3,2,3];
var res=unique(ary2);
console.log(res);

四、结语

创作不易,留下你的足迹吧~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值