数组去重(双for、对象键值对、Set)

  1. 双for循环
    (1)解决数组塌陷的问题
<script>
    let arr=[1,2,2,3,4,5,1,2,4,5,2,4];
    // i<arr.length-1最后一项不需要再拿出来了,因为每一次都是和当前项后面进行比较,而最后一项后面没有任何的东西,所以也就没有必要再拿出来比较了
    for(let i=0;i<arr.length-1;i++){
        // 每一次拿出来要和后面依次比较的那一项
        let item=arr[i];
        // let j=i+1从当前项的后一项开始逐一比较即可
        for(let j=i+1;j<arr.length;j++){
            if(item===arr[j]){
                // 当前项和后面中的某一项相等了,此时我们把后面中的这一项从原始数组中删除掉
                arr.splice(j,1);
                j--; //因为splice会改变原数组,删除完,先让j--,然后在j++,相当于没加没减,下一轮还是从当前索引开始比较,这样防止数组塌陷带来的问题
            }
        }
    }
    console.log(arr);
</script>

(2)性能优化

<script>
    let arr=[1,2,2,3,4,5,1,2,4,5,2,4];
    for(let i=0;i<arr.length-1;i++){
        let item=arr[i];
        for(let j=i+1;j<arr.length;j++){
            if(item==arr[j]){
                // 用最后一项替换当前项
                arr[j]=arr[arr.length-1];
                //最后一项删掉
                arr.pop();
                //下一轮还和这一项比(因为这一项已经变为最新的最后一项了)
                j--;
            }
        }
    } 
    console.log(arr);
</script>
  1. 对象键值对方式-数组去重
    • 只有一个循环,所以性能很好
    • 如果数组中出现对象则存在问题(因为对象的属性名不能是对象,遇到会转换为字符串):如果数组中存在数字10和字符串‘10’,则会认为是重复的(对象中的属性名是数字和字符串没啥区别);数组中如果是undefined可能也会出现问题
<script>
    let arr=[1,2,2,3,4,5,1,2,4,5,2,4];
    let obj={};
    for(let i=0;i<arr.length;i++){
        //把第一次循环得到的当前项,作为对象的属性名和属性值存储进去
        let item=arr[i];
        if(obj[item]!==undefined){
            //证明对象中有这个属性(也就是之前存储过,数组中之前就有这个值),当前值是重复的,我们需要把当前这项的值删掉即可
            arr[i]=arr[arr.length-1];
            arr.length--;
            i--;
            continue;
        }
        obj[item]=item;
    }
    console.log(arr);
</script>
  1. ES6中没有提供现成的去重方法,但是提供了一些去重的方式:Set数据结构
<script>
    let arr=[1,2,2,3,4,5,1,2,4,5,2,4];
    arr=Array.from(new Set(arr));
    console.log(arr);
</script>
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值