数组去重的N种方案

目录

几大类方案

1、indexOf/includes

2、双循环

3、先排序,再相邻比较

4、对象键值对

5、Set(ES6方法)


一、基于indexOf/includes实现方案(具有兼容性,最好自己写一个实现indexof)

1、利用数组方法splice
let ary = [12,23,12,15,25,23,14,16];
for(let i=0;i<ary.length-1;i++){
   let item = ary[i],
   args = ary.slice(i+1);
   if(args.indexOf(item)>-1){
   //包含,我们可以把当前项干掉
   //splice删除弊端
   //1、原来数组改变,这样如果i继续++,则会产生数组塌陷
   //2、性能不好,当前一项删除,后面索引都要变
   ary.splice(i,1);
    i--;
 }
}
console.log(ary)
2、利用filter过滤
let ary = [12,23,12,15,25,23,14,16];
    for(let i=0;i<ary.length-1;i++){
        let item = ary[i],
         args = ary.slice(i+1);//从第二项开始选取复制
         if(args.indexOf(item)>-1){
             //也可以用过滤的方法,让重复的值都为null,最后过滤删掉(后续filter一次)
             ary[i] = null;
           }
     }
ary = ary.filter(item=>item!=null)//过滤掉为null的值
console.log(ary)
3、用最后一项替换,新建空数组
let ary = [12,23,12,15,25,23,14,16],
    arr = []
    for(let i=0;i<ary.length-1;i++){
        let item = ary[i],
         args = ary.slice(i+1);//从第二项开始选取复制
         if(args.indexOf(item)>-1){
             //用最后一项替换
             ary[i] = ary[ary.length-1];//
             ary.length--;
             i--;
           }else{
              //新建空数组,不相等的push进去
                arr.push(item);//i的length要和ary的length相等
           }
}
console.log(ary)

二、双循环(思路:获取没重复的最右一值放入新数组,检测到有重复值时终止当前循环同时进入顶层循环的下一轮判断)

function unique(ary){
  let r = [];
  for(let i=0;i<ary.length;i++){
      for(let j=i+1;j<ary.length;j++)
          if(ary[i] === ary[j]) j=++i;
           r.push(ary[i]);
      }
         return r;
  }
let arr1 = [12,23,12,15,25,14,16];
arr1 = unique(arr1);

三、先排序,在相邻比较(基于正则)

let ary = [12,23,12,15,25,14,16];
ary.sort((a,b) => a-b);
let str = ary.join('@')+'@';//字符串以@分隔
let reg = /(\d+@)\1*/g;
    ary = [];
    str.replace(reg,(n,m)=>{
     m = Number(m.slice(0,m.length-1));
        ary.push(m);
     })
console.log(ary)

四、对象键值对(也就是把数组里面的项弄成对象,属性名属性值一样)

let ary = [12,23,12,15,25,14,16];
let obj = {};//拿数组中的每一项向新容器中存储,如果已经存储过,把当前项干掉
for(let i=0;i<ary.length;i++){
    let item = ary[i];
    //检测当前对象的属性
    if(typeof obj[item]!=='undefined'){
        ary[i] = ary[ary.length-1];
        ary.length--;
        i--;
        continue
     }
        obj[item] = item;
  }
obj = null;
console.log(ary)

五、Set(es6方法)

let ary = [12,23,12,15,25,23,25,14,16];
//let arr = new Set(ary);//这样返回结果只是是set这个类的实例
//我们要的是返回数组,所以要利用展开运算符下面这种方式或者Array.from(new Set(arr))(把类数组转为数组)
let arr = [...new Set(ary)]
console.log(arr)

在这几大类里面有N种实现方式,但是总体思路都是这几大类,大家可以回去试一下,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

菜鸟咸鱼一锅端

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

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

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

打赏作者

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

抵扣说明:

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

余额充值