web前端面试系列 - 算法( 数组去重 )

1. 思路:设置一个临时数组temp,然后遍历要去重的数组arr,如果arr中的元素能够在temp中找到,则跳过此元素,否则将此元素存入temp,最后返回temp。

实现一

1 function unique(arr){
2     var temp = [];
3     var len = arr.length;
4     for(var i = 0; i < len; i++){
5         if(temp.indexOf(arr[i]) === -1) temp.push(arr[i]);
6     }    
7     return temp;
8 }

实现二

 1 function unique( arr ) {
 2     var temp = [];
 3     var len = arr.length;
 4     for (var i = 0; i < len; i++) {
 5         var isRepeated = false;
 6         for ( var j = 0; j < temp.length; j++){
 7                 if ( arr[i] === temp[j] ){                    
isRepeated = true;
break;
}
9 } 10 if ( !isRepeated ) temp.push( arr[i] ); 11 } 12 return temp; 13 }

 

2. 思路:设置一个临时数组temp,然后遍历要去重的数组arr,如果arr[i]中的元素在arr中出现的第一次的位置也为i,则将其存入temp,否则跳过此元素,最后返回temp。

1 function unique(arr){
2     var temp = [];
3     var len = arr.length;
4     for (var i = 0; i <len; i++){
5         if(arr.indexOf([arr[i]) === i) temp.push(arr[i]);
6     }
7     return temp;
8 }

3. 思路:设置一个临时对象tempObj,然后遍历要去重的数组arr, 如果arr[i]中的元素在此对象中有标记,则跳过,否则在临时对象中进行标记,并将其存入临时数组tempArr, 最后返回tempArr。

 1 function unique(arr){
 2     var tempObj = {};
 3     var tempArr = [];
 4     var len = arr.length;
 5     for (var i = 0; i < len; i++) {
 6         if ( !tempObj[arr[i]] ){
 7             tempObj[arr[i]] = true;
 8             tempArr.push(arr[i]);
 9         }
10     }
11     return tempArr;
12 }

4. 思路:对要去重的数组 arr 先进行排序,这样重复的元素就排在了相邻的位置,然后对数组 arr 进行遍历,将arr[i] 与 临时数组 temp 中的最后一个元素进行比较,如果不同则将其存入临时数组,如果相同则跳过此元素,最后返回临时数组。

 1 function unique( arr ) {
 2     var temp = [];
 3     var len = arr.length;
 4     arr.sort();
 5     temp.push(arr[0]);
 6     for ( var i = 1; i < len; i++ ) {
 7         if ( arr[i] !== temp[temp.length-1] ) temp.push(arr[i]);
 8     }
 9     return temp;
10 }

 写在最后:其实在真实的项目中,我们没有必要自己去实现这样的函数,利用underscore.js 或者lodash 这样的函数库提供的方法是更好的选择。

转载于:https://www.cnblogs.com/xiaodi-js/p/5925842.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值