Javascript中数组去重的六种方法

数组去重
  • 第一种方法:
  • 先对数组进行排序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]);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值