JS下的6種數組去重方式


方法一:

function deRepeated(arr){//傳入要去重的目標數組
         var newArr=[];
         for(var i=0;i<arr.length;i++){

         //遍歷目標數組各項,新數組中尚不存在的就把它存入新數組
            if(newArr.indexOf(arr[i]) == -1){
                newArr.push(arr[i]);
            }

         }
         return newArr;//返回去重後的新數組
}
deRepeated([2,3,2,32,43,32,8,3,9,76,43,43,3,8,3]);//[2,3,32,43,8,9,76]

方法二:

function deRepeated(arr){
        var newArr=[];
        for(var i=0;i<arr.length;i++){

  //遍歷目標數組各項,返回第一次出現的位置是i,說明不是重複項,存入新數組
              if(arr.indexOf(arr[i]) == i){
                    newArr.push(arr[i]);
              }

        }
        return newArr;
}
deRepeated([2,3,2,32,43,32,8,3,9,76,43,43,3,8,3])//[2,3,32,43,8,9,76]

方法三:

      因爲方法一和方法二都用到了ES5的indexOf()方法,有些瀏覽器可能不兼容。還可採用方法三:先對目標數組重排序,排序後重復項相鄰,而後遍歷目標數組。當排序後目標數組的項不是新數組的最後一項時,說明不是重複項,推入新數組。數組

function deRepeated(arr){
            var newArr=[];
            arr.sort();
            for(var i=0;i<arr.length;i++){
            
                //遍歷目標數組,第i項和新數組末項比較
                if(arr[i] !== newArr[newArr.length-1]){
                    newArr.push(arr[i]);//推入新數組末端
                }

            }
            return newArr;
        }
 deRepeated([2,3,2,32,43,32,8,3,9,76,43,43,3,8,3]);//[2,3,32,43,76,8,9]

注意點:因爲涉及到直接比較數組的項,因此應採用不全等方式"!==";  
缺點:因爲對目標數組進行先排序後去重,所以返回的也是排序後的新數組。瀏覽器


方法四:

      原理是遍歷目標數組各項,保存爲對象屬性並統一給其設置屬性值1,給重複的屬性設置值時會覆蓋原來的,而後遍歷對象屬性,因爲返回的是字符串形式,應轉爲數字後再存入新數組。code

function deRepeated(arr){
            var obj={},
                newArr=[];
            for(var i=0;i<arr.length;i++){
                obj[arr[i]]=1; //給對象添加屬性
            }
            for(var j in obj){  //遍歷對象屬性
                newArr.push(parseInt(j));
            }
            return newArr;
}
deRepeated([2,3,2,32,43,32,8,3,9,76,43,43,3,8,3]);//[2,3,8,9,32,43,76]

方法五:  

      在stackoverflow上看到了這種針對數組中爲純數字時的排序去重方法。對象

function deRepeated(arr){
         arr.sort(function(a,b){  //對目標數組重排序,使有重複項的相鄰
                  return a-b; 
         })
         var newArr=[arr[0]]; //第一項先放入新數組中
         for(var i=1;i<arr.length;i++){
                  if(arr[i-1] !== arr[i]){ //迭代相鄰項,找到不一樣項時才推入新數組
                           newArr.push(arr[i]);
                  }
         }
         return newArr;
}
console.log(deRepeated([2,3,8,2,3,43,8,43,2,5,3])); //[2,3,5,8,43]

方法六:  

      利用ES6新增的對象內置類型Set,利用其元素不重複的特色,在實例內部實現自動去重。  排序

function deRepeated(arr){
         var set=new Set(arr);

         arr.splice(0);
         arr.push(...set); 
         return arr;   //返回原數組

         //return new Array(...set);   //返回新數組
}
var arr=[2,3,6,4,7,3,5,4,4,4];
console.log(deRepeated(arr));   //[2,3,6,4,7,5]
相關文章
相關標籤/搜索