js-数组去重(有五种方法)-包含数组扩展形式

对于arr,arr1可以使用简单的去重方法,但要注意时间复杂度的比较。
对于arr2,可以对里面的数组进行toString(),转化为字符串再比较,不能直接进行数组比较。
对于arr3,判断null时需要注意,null不等于null,所以需增加条件this[i]==this[i],当this[i]!=this[i]时,说明this[i]为null,需另外处理

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>js-数组去重</title>
    <meta content="http://note.youdao.com/share/index.html?id=55da195bec366816c2093d2e630fb812&type=note#/">
    <style></style>
    <script>    
        var tem = new Array("2","3","5","3","4","5");

        var arr = ['1a','ni','2','ni','1a','5']; //字符串数组
        var arr1 = [1,5,2,3,1,5,9]; //数字数组
        var arr2 = [1,5,[1,2],4,9,1,[1,2]]; //包含数组的数组
        var arr3 = [1,4,undefined,7,8,null,null]; //包含null的数组

        //1. 遍历,数组下标去重法
        //时间复杂度:O(n^2),indexOf本身也消耗了O(n)的复杂度,空间复杂度:O(n)
        //IE8以下不支持indexOf
        Array.prototype.removeRepeat1 = function() {
            var res =[this[0]];
            for(var i=1; i<this.length;i++){ //从第二项开始遍历
                if(this.indexOf(this[i])==i){
                    res.push(this[i]);
                }
            }
            return res;
        };

        //2. 遍历,比较备用数组去重法
        Array.prototype.removeRepeat2 = function() {
            var res =[];
            for(var i=0; i<this.length;i++){
                if(res.indexOf(this[i])==-1){
                    res.push(this[i]);
                }
            }
            return res;
        };

        //3. 遍历,hash去重法
        //类似于,利用对象的属性不能相同的特点进行去重
        //时间复杂度:O(n),空间复杂度:O(n)
        Array.prototype.removeRepeat3 = function() {
            var h= {};  //哈希表
            var res = [];
            for(var i=0; i<this.length;i++){
                if(!h[this[i]]){    //如果hash表中没有当前项
                    h[this[i]]=true; //存入hash表
                    res.push(this[i]);
                }
            }
            return res;
        };

        //4. 遍历,Set去重法(ES6的 Set)
        //时间复杂度:O(n),空间复杂度:O(n) Set兼容性不好,IE11以下不支持
        Array.prototype.removeRepeat4 = function(){
               var result = new Set();
               for(var i=0; i<this.length; i++){
                  result.add(this[i]);
               }
               return result;
        }
        //Set的方法二:Array.from(array)把Set转化为数组
        Array.prototype.removeRepeat41 = function(){     
               return Array.from(new Set(this));;
        }

        //5. 排序后相邻去重法
        Array.prototype.removeRepeat5 = function() {
            this.sort();
            var res=[this[0]];
            for(var i = 1; i< this.length; i++){
                if(this[i]!=this[i-1]){
                    res.push(this[i]);
                }
            }
            return res;
        }


        var result = arr2.removeRepeat1();
        for(var i=0; i< result.length; i++){
            console.log(result[i]);
        }

        /*console.log(result); //set数组直接输出就好,不用遍历*/


        /*对于arr2,可以对里面的数组进行toString(),转化为字符串再比较,不能直接进行数组比较。*/
        //双重循环做arr2
        var arr2 = [1,[1],5,[1,2],4,9,1,[1,2],[1]]; //包含数组的数组
        //先toString()在比较,注意不能使用全等,数组全等要求地址也相同的
        Array.prototype.unique = function() {
            var res=[];
            for(var i=0;i<this.length;i++){
                var flag = false;
                for(var j=0;j<res.length;j++){
                    if(this[i].toString()==res[j].toString()  &&  (typeof this[i])==(typeof res[j])){
                        flag = true;
                    }
                }
                if(!flag){
                    res.push(this[i]);
                }
            }

            return res;
        };

        /*对于arr3,判断null时需要注意,null不等于null,所以需增加条件this[i]==this[i],当this[i]!=this[i]时,说明this[i]为null,需另外处理*/
        //全等
        var arr3 = [1,4,undefined,7,8,null,null]; //包含null的数组
        Array.prototype.unique = function() {
            var res=[];
            for(var i=0;i<this.length;i++){
                var flag = false;
                for(var j=0;j<res.length;j++){
                    if(this[i]===res[j]){
                        flag = true;
                    }
                }
                if(!flag){
                    res.push(this[i]);
                }
            }
            return res;
        };

        var result = arr3.unique();
        for(var i=0; i< result.length; i++){
            console.log(result[i]);
        }   
    </script>
</head>
<body>

</body>
</html> 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值