数组去重方法

方法1:双for循环

实现思路:依次遍历数组中的每一项,拿当前项和其后面的每一项进行比较,如果后面中有和他相同的,则说明这是重复的,我们把后面中重复的这一项删除即可

    //外层循环控制每一次拿出一项和其后面的比

    // 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--;//删除完,先让j--,然后j++,相当于没加没减,下一轮还是从当前索引开始比较,这样就可以防止塌陷带来的问题

             }

        }

     }

注意:使用splice()删除的时候,会造成数组塌陷和性能问题(如果后面有1000万项,删除之前相等的某一项,造成的数组塌陷,会使后面的下标提前)

数组塌陷:

splice性能优化:

思路:在主体思路不变下,将外层循环获取到的第一项之后的一项与最后一项进行互换,这个时候,最后一项就没有存在的必要了,所以删除最后一项,互换后的这一项还需要与之后循环后的每一项进行比较

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.length--;

                //下一轮还和这一项比,(因为这一项已经变为最新的最后一项了)

                j--;

            }

        }

    }

方法2:对象的键值对方式去重:

        1.只有一个循环,所以性能很好

        2.如果数组中出现对象(或者函数)则存在问题,因为对象的属性名不能是对象,遇到会转换为字符串;如果数组中存在数字10和'10',则也会认为是重复的(对象中的属性名是数字和字符串没啥区别);数组中的值如果是undefined也会出现问题

let arr = [1,2,3,1,1,4,2,3];

       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);

方法3: ES6(Set数据结构)

let arr = [1,2,3,1,1,4,2,3,'3'];

arr = Array.from(new Set(arr));

console.log(arr);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

18年

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值