面试题30:JS数组去重的八种方法

122 篇文章 11 订阅

目录

第一种:将原数组排序,在与相邻的进行比较,如果不同则存入新数组。

第二种: 利用对象不能存储重复属性的特性(哈希思想)

第三种:利用数组的indexOf下标属性来查询。(推荐,很简便易懂,内存消耗低)

第四种方法:利用数组原型对象上的includes方法。

第五种:利用数组原型对象上的 filter 和 includes方法。

第六种:利用数组原型对象上的 forEach 和 includes方法。

方法七:利用数组原型对象上的 splice 方法。

第八种方法:利用 ES6的set 方法


第一种:将原数组排序,在与相邻的进行比较,如果不同则存入新数组。

function unique2(arr){
    var arr2 = arr.sort();
    var res = [arr2[0]];
    for(var i=1; i<arr2.length; i++){
     if(arr2[i] !== res[res.length-1]){
      res.push(arr2[i]);
     }
    } 
    return res;
   }
   
console.log(unique2([1,1,2,3,5,3,1,5,6,7,4]));

第二种: 利用对象不能存储重复属性的特性(哈希思想)

我的官方解释:哈哈哈嗝, 对象也是存储属性名的数组     abj[arr[i]]    arr[i]的值对应的就是key   ,然后value 得obj自己赋值    如果arr[a]=arr[b]    就是key相等   就 !abj[arr[i]] 就不会进入循环

function unique3(arr){
    var res = [];
    var obj = {};
    for(var i=0; i<arr.length; i++){
     if( !obj[arr[i]] ){
      obj[arr[i]] = 1;
      res.push(arr[i]);
     }
    } 
    return res;
   }
   
console.log(unique3([1,1,2,3,5,3,1,5,6,7,4]));

第三种:利用数组的indexOf下标属性来查询。(推荐,很简便易懂,内存消耗低)

indexOf方法
    原理是:
        indexOf方法找到指定值时返回元素下标,未找到时返回-1,
        找到了就返回它值的下标。
function unique4(arr){
    var res = [];
    for(var i=0; i<arr.length; i++){
     if(res.indexOf(arr[i]) == -1){
      res.push(arr[i]);
     }
    }
    return res;
   }
   
console.log(unique4([1,1,2,3,5,3,1,5,6,7,4]));
   

第四种方法:利用数组原型对象上的includes方法。

includes() 方法用于判断字符串是否包含指定的子字符串,或者判断数组中是否有指定的元素。
例如:[‘hellow’,‘world’].includes(‘hellow’) ,如果数组存在指定元素就会返回true,没有就返回false。

function unique5(arr){
 var res = [];
 
 for(var i=0; i<arr.length; i++){
  if( !res.includes(arr[i]) ){ // 如果res新数组包含当前循环item
   res.push(arr[i]);
  }
 }
 return res;
}

console.log(unique5([1,1,2,3,5,3,1,5,6,7,4]));

第五种:利用数组原型对象上的 filter 和 includes方法。

function unique6(arr){
 var res = [];
 
 res = arr.filter(function(item){
  return res.includes(item) ? '' : res.push(item);
 });
 return res;
}


console.log(unique6([1,1,2,3,5,3,1,5,6,7,4]));

第六种:利用数组原型对象上的 forEach 和 includes方法。

function unique7(arr){
 var res = [];
 
 arr.forEach(function(item){
  res.includes(item) ? '' : res.push(item);
 }); 
 return res;
}


console.log(unique7([1,1,2,3,5,3,1,5,6,7,4]));

方法七:利用数组原型对象上的 splice 方法。

function unique8(arr){
 var i,
  j,
  len = arr.length; 
 for(i = 0; i < len; i++){
  for(j = i + 1; j < len; j++){
   if(arr[i] == arr[j]){
    arr.splice(j,1);
    len--;
    j--;
   }
  }
 }
 return arr;
}


console.log(unique8([1,1,2,3,5,3,1,5,6,7,4]));

第八种方法:利用 ES6的set 方法

function unique10(arr){
 //Set数据结构,它类似于数组,其成员的值都是唯一的
 return Array.from(new Set(arr)); // 利用Array.from将Set结构转换成数组
}


console.log(unique10([1,1,2,3,5,3,1,5,6,7,4]));

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值