数组去重(es5,es6)

const arr = [1,2,"1",null,null,undefined,undefined,false,false,NaN,NaN];

1.0 遍历 无法判断NaN
//for循环去重,效率较高
const unique1 = (arr)=>{
  const newArr = [];
  let item;
  for (let i = 0 , len = arr.length ; i < len; i++) {
    item = arr[i];
    if(newArr.indexOf(item) === -1){
      newArr.push(item);
    }
  }
  return newArr;
}
console.log('遍历:unique1',unique1(arr));//[1, 2, null, false, NaN, NaN]

//forEach  效率不如for,判断不出NaN
const unique2 = (arr)=>{
  const newArr = [];
  arr.forEach(item=>{
    if(newArr.indexOf(item) === -1){
      newArr.push(item);
    }
  })
  return newArr;
}
console.log('遍历:unique2',unique2(arr));//[1, 2, null, false, NaN, NaN]

//reduce
const unique3 = (arr)=>{
  return arr.reduce((pre,next)=>{
    if(pre.indexOf(next) === -1){
      pre.push(next)
    };
    return pre;
  },[])
}
console.log('遍历:unique3',unique3(arr));// [1, 2, null, false, NaN, NaN]
//解决NaN无法排除问题
const unique1_1 = (arr)=>{
  const newArr = [];
  let item;
  let flag = true;
  for (let i = 0 , len = arr.length ; i < len; i++) {
    item = arr[i];
    if(newArr.indexOf(item) === -1){
      if(item != item){ //排除NaN
        if(flag){
          newArr.push(item);
          flag = false;
        }
      }else {
        newArr.push(item);
      }
    }
  }
  return newArr;
}

console.log('解决NaN问题:unique1_1',unique1_1(arr));//[1, 2, null, false, NaN]
2.0 索引去重 把NaN直接全部去除掉了
//2.1for
 const unique4 = (arr)=>{
   const newArr = [];
   let item;
   for (let i = 0 , len = arr.length; i < len; i++) {
     item = arr[i];
     if(arr.indexOf(item) === i){
       newArr.push(item);
     }
   }
   return newArr;
 }
 console.log('索引去重:unique4',unique4(arr));//[1, 2, null, false]


//2.2filter
const unique5 = (arr)=>{
  return arr.filter((item,index,arr)=>arr.indexOf(item) === index)
}
console.log('索引去重:unique4',unique5(arr));//[1, 2, null, false]
3.0集合转换 效率低,能去掉重复NaN;
//Set
const unique6 = (arr)=>{
  return Array.from(new Set(arr));
}
console.log('集合转换:unique6',unique6(arr));



挂载方法到Array上
const unique = function(){
  return Array.from(new Set(this));
}
Array.prototype.unique = unique;
const uniqueArr = arr.unique();

总结: 遍历无法判断NaN需要手动判断,for效率最高;索引去重直接把所有NaN干掉了,看情况使用;Set去重简单、能去掉NaN,但是效率最低;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值