zoukankan      html  css  js  c++  java
  • js的去重

    1、ES6 : set

      注set的坑:

        类数组转为数组,ES6提供了Array.from的方式,但在ES5中,类数组可以通过[].sclice.call(likeArr)转换,但对set无效

          如:var a = new Set([1,1,2,3]);     [].slice.call(a)  -->  [];//得到空数组

        将set转为数组的方式可以为:Array.from(set)  ;    也可以为:var arr = [...set];//同样是es6的,解构方式。。。。

    var arr = [1,2,3,3,2,3];
    
    //第一个方案:Set
    //Array.from:将类数组对象转为数组
    var arr1 = Array.from(new Set(arr));
    
    console.log("方法二:"+arr1);// [1,2,3]

    2、for循环,创建新数组

    var unique = function(arr){
        if(Object.prototype.toString.call(arr)=='[object Array]'){//类型判断
            var newArr = [];
            for(let i=0,len=arr.length;i<len;i++){
                if(newArr.indexOf(arr[i]) < 0){//不存在
                    newArr.push(arr[i]);
                }
            }
            return newArr;
        }else{
            return arr;
        }
    }

    3、使用对象的键值属性

    function unique2(arr) {
        if (Object.prototype.toString.call(arr) !== '[object Array]') return arr;
    
        var obj = {};
        var newArr = [],type,val;
        for(var i=0,len=arr.length;i<len;i++){
            val = arr[i],type = typeof val;
            if(!obj[val]){//对象中没相应的键值,添加键值,同时赋值类型
                obj[val] = [type];
                newArr.push(val);
            }else if(obj[val].indexOf(type)<0){//
                //对象中有键值,但键值中的值对应type和数组元素type不一致,
                //此时判断键值的对应值,原因为:
                //a[1] 和a["1"]取出来是一样的,所以需要区分1和”1“
                obj[val].push(type);
                newArr.push(val);
            }
        }
        return newArr;
    }
    var arr = [1,2,3,3,2,3,4,5,3];
    var arr1 = ["1",1,2,"2",3,2];
    console.log("第三种方式1:"+unique2(arr));//得到[1,2,3,4,5]
    console.log("第三种方式2:"+unique2(arr1));//得到["1", 1, 2, "2", 3]

    4、判断数组下标

    //判断数组下标
    var unique3 = function(arr){
        if (Object.prototype.toString.call(arr) !== '[object Array]') return arr;
        var newArr = [];
        for(var i=0,len=arr.length;i<len;i++){
            //如果当前数组的第i项在当前数组中第一次出现的位置不是i, 
            //那么表示第i项是重复的,忽略掉。否则存入结果数组 
            if(arr.indexOf(arr[i])==i){
                newArr.push(arr[i]);
            }
        }
        return newArr;
    }

     5、排序后,给新数组逐个添加,并在添加前判断,新数组中的最后一个是否相等,注意此处一定为全等

    // 将相同的值相邻,然后遍历去除重复值 
    function unique4(array){ 
        array.sort(); //排序后,相同的值就会排在一起
        var re=[array[0]]; 
        for(var i = 1; i < array.length; i++){ 
            if( array[i] !== re[re.length-1]){ //每次添加比较新数组的最后一个
              re.push(array[i]); 
             } 
         } 
         return re; 
    }     
  • 相关阅读:
    Oracle学习(四)--sql及sql分类讲解
    Oracle学习(三)--数据类型及常用sql语句
    Oracle学习(二)--启动与关闭
    Tomcat学习笔记--启动成功访问报404错误
    有关Transaction not successfully started问题解决办法
    百度富文本编辑器UEditor1.3上传图片附件等
    hibernate+junit测试实体类生成数据库表
    js登录与注册验证
    SVN安装配置与使用
    [LeetCode] #38 Combination Sum
  • 原文地址:https://www.cnblogs.com/laojun/p/8331842.html
Copyright © 2011-2022 走看看