美文网首页@IT·前端编程世界JS闯关之路
Javascript中数组去重的六种方法

Javascript中数组去重的六种方法

作者: icessun | 来源:发表于2017-04-04 17:38 被阅读684次

    数组去重

    • 第一种方法:
    • 先对数组进行排序sort(),排好序,然后把数组的当前项和后一项进行比较,相同则使用数组的splice(相同的位置,1),但是为了防止数组塌陷,每次删除数组元素的时候要把i的值减一。
            
            var ary=[1,23,4,2,33,1,2,44,3,2,3]
            ary.sort(function(a,b){
            return a-b;
            });//返回的是排好序的数组
        for(var i=0;i<ary.length;i++){
        if(ary[i]===ary[i+1])
        {
        ary.splice(i,1);
        i--;//为了防止数组塌陷
    
            }
        
        }
        
    
    • 第二种方法是:建立一个新数组,要是原数组里面的数是头一次出现(使用数组的indexOf()),那么就把这个数放到新数组里面,否者就抛弃这个数,类似于前面说的随机验证码
    var ary=[1,23,4,2,33,1,2,44,3,2,3]
    
    var arr2=[];
    for(var i=0;i<ary.length;i++){
    if(arr2.indexOf(art[i])==-1){
    arr2.push(ary[i]);
    }
    }
    
    • 第三种方法:直接拿当前项与后一项进行比较,相同的要删除,使用数组splice()进行删除,这里也要防止数组塌陷;
    var ary=[1,23,4,2,33,1,2,44,3,2,3]
    for(var i=0;i<ary.length;i++){
    for(var j=i+1;j<ary.length;j++){
    
    if(ary[i]===ary[j]){
    ary.splice(j,1);
    j--;
    }
    }
    }
    
    • 第四种方法:利用对象不重名的特性,对象的存储是键值对方式,要获取属性值,要通过对象./[]属性来获取;相同则删除,也要防止数组塌陷
    var ary=[1,23,4,2,33,1,2,44,3,2,3]
    //新建一个对象
    var obj={};
    for(var i=0;i<ary.length;i++){
    var cur=ary[i];
    //如果obj【cur】为真,那就说明对象里面找到了这个数,重复了
    if(obj[cur]){
    ary.splice(i,1);
    i--;
    }else{
    //给对象赋值  说明obj.xxx=undefined  不存在为假
    obj[cur]=cur;//obj【1】=1;
    }
    }
    
    • 第五种方法:也是利用对象不重名的方法,但是这次是直接计算其数组各个数的重复次数,
    var ary=[1,23,4,2,33,1,2,44,3,2,3]
    var obj={};
    for(var i=0;i<ary.length;i++){
     var cur=ary[i];
     if(obj[cur]){
     //每次重复一次,其对应的值加一
       obj[cur]++;
    }else{
    //说明没有重复,个数只有一个
    obj[cur]=1;
    }
    }
    var ary2=[];
    //对于对象使用in 方法进行遍历,遍历获取的是属性值
    for(var attr in obj){
      ary2.push(Number(attr));
    }
    
    
    • 第六种方法:使用ES6中的Set数据结构中重复项不生效的特性
    let arr = [1,2,3,3,2,4,5];
    
    let list = new Set(arr);
    
    console.log("list",list);  // 1,2,3,4,5  
    

    但是对于数据的数据类型是不会进行转换的,所以一定要注意元素的数据类型是否是一致

    数组去重的面试题:

    找出这次考试中,最高分,及最高分出现的次数

    //思路:全部人的成绩是一个数组,这就相当于使用数组去重的方法,找到最高的分数,和其次数,首先找到了去重的数组进行从小到大的排序,得到次数,然后通过最高分所对应的索引值得到出现的最高分
    
    var ary = [1, 23, 4, 2, 33, 1, 2, 44, 3, 2, 3];
                var obj = {};
                for(var i = 0; i < ary.length; i++) {
                    //把数组的值,当作对象的索引赋值给对象,所以通过对象索引获取的是数组出现的次数
                    var cur = ary[i];
                    if(obj[cur]) {
                        //每次重复一次,其对应的值加一
                        obj[cur]++;
                    } else {
                        //说明没有重复,个数只有一个
                        obj[cur] = 1;
                    }
                }
                //分数从低到高出现的次数
                console.log(obj);
                
                var ary2 = [];
                //对于对象使用in 方法进行遍历,遍历获取的是属性值
                for(var attr in obj) {
                    ary2.push(Number(attr));
                }
                
                console.log(ary2);
                //最高分
                console.log(ary2[ary2.length-1]);
                var count=ary2[ary2.length-1];
                //最高分出现的次数
                console.log(obj[count]);
    

    相关文章

      网友评论

      • 星月西:还有一种方法,可以使用ES6里面的Set数据结构,直接var array=[...new Set(array)]
        icessun:学习到了,谢谢你;已经补充
      • 德国佛:这是什么语言
        icessun:@德国佛 Javascript
      • i7eo:let ary = [1, 23, 4, 2, 33, 1, 2, 44, 44, 3, 2, 3],
        maxScore = Math.max.apply(Math , ary),
        maxScore_num = 0;
        for (let i = 0, len = ary.length; i < len; i++) {
        if (ary[i] === maxScore) {
        maxScore_num ++;
        }
        }
        console.log('maxscore, maxscore_num: ', maxScore, maxScore_num);

        这样更快,当然最好还是如二楼所说加上类型判断才完美。
        icessun:谢谢,学习到了:smile:
      • 022d3d2df738:第四种方法没有考虑数据的类型问题,比如1和'1'是两个不想同的值,对象属性不会区分。可以考虑加类型区分
        icessun:多谢指点
      • 75d982da5260:回去好好思考一下

      本文标题:Javascript中数组去重的六种方法

      本文链接:https://www.haomeiwen.com/subject/stkzottx.html