• javascript数组去重的三种常用方法,及其性能比较


       在进行数组操作时往往会遇到去掉重复项的问题,下面简单介绍下数组去重的方法,以及其执行效率

     方法一
            采用两次循环
            原理:拿当前的和他后面的比,如果后面的有重复的就干掉
            但是我们发现数组最后一项,后面没有东西,那他就不用和后边的比较了,所以我们只要循环arr.length-1次就可以了

     1     var arr=[1,3,5,3,5,3,4,1,3,5,3,5,3,41,3,5,3,5,3,4,1,3,5,3,5,3,4];
     2                for(var i=0;i<arr.length-1;i++){
     3                        var curItem=arr[i];//当前项
     4                        for(var j=i+1;j<arr.length;j++){
     5                                if(curItem==arr[j]){
     6                                       arr.splice(j,1);
     7                                        j--;
     8                                    }
     9                              }
    10                     }
    11               console.log(arr);

    此方法运用了了两次循环,给浏览器带来很大压力,次数为数组长度的阶乘。

    所以考虑用对象替代(对象的属性名字不会重复)方法二

     1         var arr=[1,3,5,3,5,3,4,6,2,2,2,1];
     2         var len=arr.length;
     3         var obj={};
     4 
     5         for(var i=0;i<len;i++){
     6             var cur=arr[i];//当前项
     7             obj[cur]=cur;
     8         }
     9         var list=[];
    10         for(key in obj){
    11             list.push(obj[key])
    12         }
    13         console.log(list);

    此方法执行效率较高,但循环使用两次

    采用另一种方法:方法三

    原理:  循环数组,把数组中的每一项当做obj对象的属性名和属性值存进来,
            但是我们发现如果obj对象中已经存在了这个属性名的话,那就说明数组重复了,那我们删除重复的项

     1  var arr=[1,3,5,3,5,3,4,1,3,5,3,5,3,41,3,5,3,5,3,4,1,3,5,3,5,3,4];
     2 
     3         var obj={};
     4         for(var i=0;i<arr.length;i++){
     5             var cur=arr[i];//当前项
     6             if(obj[cur]==cur){
     7                 arr.splice(i,1);
     8                 i--
     9             }else{
    10                 obj[cur]=cur;
    11             }
    12 
    13         }
    14         obj=null;
    15         console.log(arr);

    此方法也运用两次循环,仔细想想还有运用一次实现去重的方法。

    对方法二封装成方法

     1         var arr=[1,3,5,3,5,3,4,6,2,2,2,1,7,84,34,634];
     2 Array.prototype.arr_unique=function (){
     3     var len=this.length;
     4     var obj={};
     5 
     6     for(var i=0;i<len;i++){
     7         var cur=this[i];//当前项
     8         obj[cur]=cur;
     9     }
    10     var list=[];
    11     for(key in obj){
    12         list.push(obj[key])
    13     }
    14 
    15     return list;
    16 
    17 };
    18 
    19 console.log(arr.arr_unique());


    对方法三封装成方法

     1                var arr=[1,3,5,3,5,3,4,6,2,2,2,1,7,84,34,634];
     2          Array.prototype.arr_unique=function (){
     3              var obj={};
     4              for(var i=0;i<this.length;i++){
     5                  var cur=arr[i];//当前项
     6 
     7                  if(obj[cur]==cur){
     8                      alert(1111);
     9                      arr.splice(i,1);
    10                      i--
    11                  }else{
    12                      obj[cur]=cur;
    13                  }
    14              }
    15              obj=null;
    16              return this;
    17              };
    18          console.log(arr.arr_unique());
  • 相关阅读:
    浏览器内核
    link和@import的区别
    跨域iframe如何通信
    数组、对象基本操作
    浏览器兼容性问题
    微信H5开发
    前端面试整理
    js多维数组转一维数组
    js实现继承
    javascript函数闭包(closure)
  • 原文地址:https://www.cnblogs.com/lisongy/p/4176003.html
Copyright © 2020-2023  润新知