zoukankan      html  css  js  c++  java
  • javascript数组去重的三种常用方法,及其性能比较

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

     方法一
            采用两次循环
            原理:拿当前的和他后面的比,如果后面的有重复的就干掉
            但是我们发现数组最后一项,后面没有东西,那他就不用和后边的比较了,所以我们只要循环arr.length-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];
                     for(var i=0;i<arr.length-1;i++){
                           var curItem=arr[i];//当前项
                           for(var j=i+1;j<arr.length;j++){
                                   if(curItem==arr[j]){
                                          arr.splice(j,1);
                                           j--;
                                       }
                                 }
                        }
                  console.log(arr);

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

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

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

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

    采用另一种方法:方法三

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

            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];
    
            var obj={};
            for(var i=0;i<arr.length;i++){
                var cur=arr[i];//当前项
                if(obj[cur]==cur){
                    arr.splice(i,1);
                    i--
                }else{
                    obj[cur]=cur;
                }
    
            }
            obj=null;
            console.log(arr);    

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

    对方法二封装成方法

    var arr=[1,3,5,3,5,3,4,6,2,2,2,1,7,84,34,634];
    Array.prototype.arr_unique=function (){
        var len=this.length;
        var obj={};
    
        for(var i=0;i<len;i++){
            var cur=this[i];//当前项
            obj[cur]=cur;
        }
        var list=[];
        for(key in obj){
            list.push(obj[key])
        }
    
        return list;
    
    };
    
    console.log(arr.arr_unique());

    对方法三封装成方法

            var arr=[1,3,5,3,5,3,4,6,2,2,2,1,7,84,34,634];
             Array.prototype.arr_unique=function (){
                 var obj={};
                 for(var i=0;i<this.length;i++){
                     var cur=arr[i];//当前项
    
                     if(obj[cur]==cur){
                         alert(1111);
                         arr.splice(i,1);
                         i--
                     }else{
                         obj[cur]=cur;
                     }
                 }
                 obj=null;
                 return this;
                 };
             console.log(arr.arr_unique());    
  • 相关阅读:
    GNU build system / autoconf 和 automake 生成 Makefile 文件
    使用you-get下载网站内嵌的视频
    ffmpeg偷懒
    GB28181的PS流完全分析(封装 / 分包发送 / 接收组包 / 解析)
    JRE与JDK的区别
    图解SQL的inner join、left join、right join、full outer join、union、union all的区别
    linux常用查看日志命令
    Hadoop2.6.2的Eclipse插件的使用
    path与classpath区别(转)
    在Eclipse上运行Spark(Standalone,Yarn-Client)
  • 原文地址:https://www.cnblogs.com/coprince/p/4178416.html
Copyright © 2011-2022 走看看