首页 > 代码库 > 数组去重

数组去重

总结下javascript中常见的数组去重方法,面试中也经常会遇到这个问题。引申的还有合并数组并去重。

方法一:遍历数组

思路:新建一数组,遍历传入数组,若元素不在新数组中就添加到新数组中。

注意:判断值是否在数组的方法“indexOf”是ECMAScript5方法,IE8以下不支持,需多写兼容低版本浏览器代码。 

 1 //判断浏览器是否支持indexOf方法
 2      if(!Array.prototype.indexOf){
 3          //新增indexOf方法
 4          Array.prototype.indexOf = function(item){
 5              var result = -1,
 6                  arr_item = null;
 7              if(this.length == 0) {
 8                  return result;
 9              }
10              for(var i=0,len=this.length; i<len; i++){
11                  arr_item = this[i];
12                  if(arr_item === item){
13                      result = i;
14                      break; 
15                  }
16              }
17              return result;
18          };
19      }
20     

 

 

1 function unique1(arr){
2     var newArr = [];//新建一个数组
3     for(var i=0,len=arr.length;i<len;i++){
4         if(newArr.indexOf(arr[i]) == -1){//若新数组中未包含该项则将其存入新数组
5          newArr.push(arr[i]);
6      }
7     }
8     return newArr;
9 }    

方法二:数组下标去重法

思路:如果当前数组的第i项在当前数组中第一次出现的位置不是i,那么表示第i项是重复的,忽略掉。否则存入结果数组。

注意:此方法也用到了“indexOf”方法。

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

方法三:排序后相邻去重法

思路:将传入的数组进行排序,相同的元素就会相邻。再遍历数组,将元素与新数组的最后一个值进行比较,若不同则加入新数组。

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

方法四:优化遍历数组法

思路:遍历传入的数组,元素与右边的元素依次比较,若元素有重复,则结束当前的元素比较,将下一个元素当做比较对象,即跳出内层循环。

 1 function unique4(arr){
 2      var newArr = [];
 3      for(var i=0,len=arr.length; i<len;i++){
 4          for(var j=i+1;j<len;j++){
 5              if(arr[i] === arr[j]){//获取没重复的最右一值放入新数组
 6                  ++i;
 7              }                 
 8          }
 9          newArr.push(arr[i]);
10      }
11      return newArr;
12 }

引申:合并数组并去重

一、concat()方法

思路:concat() 方法将传入的数组或非数组值与原数组合并,组成一个新的数组并返回。该方法会产生一个新的数组。

function concatArr(arr1, arr2){
    var arr = arr1.concat(arr2);
    arr = unique1(arr);//再引用上面的任意一个去重方法
    return arr;
}

二、Array.prototype.push.apply()

思路:该方法优点是不会产生一个新的数组。

1 var a = [1, 2, 3];
2 var b = [4, 5, 6];
3 
4 Array.prototype.push.apply(a, b);//a=[1,2,3,4,5,6]
5 //等效于:a.push.apply(a, b);
6 //也等效于[].push.apply(a, b); 
1 function concatArray(arr1,arr2){
2     Array.prototype.push.apply(arr1, arr2);
3     arr1 = unique1(arr1);
4     return arr1;
5 }

数组去重