1. 程式人生 > >javascript之九種陣列去重的方法

javascript之九種陣列去重的方法

       陣列去重,第一反應就是for迴圈,如果一個for迴圈解決不了,那就多來幾個。。。哈哈,心血來潮查了下陣列去重的方法,是我見識短淺。以下,我將介紹九種js中陣列去重的方法:

  • 利用 ES6 Set去重
  • 利用splice()去重
  • 利用indexOf()去重
  •  利用sort()去重
  • 利用 物件的屬性不能相同的特性進行陣列去重
  • 利用includes() 
  • 利用hasOwnProperty()去重
  • 利用遞迴去重
  • 利用Map資料結構去重 

 利用ES6 Set()去重:

/*ES6 Set()方法陣列去重*/
function unique(arr) {
    //from()是將Set()資料結構轉換為陣列型別
    //Set()資料結構類似於陣列,但不同的是Set()成員值唯一
    return Array.from(new Set(arr));  
}
var arr =[1,1,2,3,4,4];
console.log(unique(arr));

       控制檯輸出結果如下:

   利用splice()去重:

function unique1(arr) {
    for(var i = 0; i < arr.length; i++){
        for(var j = i+1; j < arr.length; j++){
            if(arr[i]==arr[j]){
                arr.splice(j,1);    //splice(j,1, )替換的值是空
                j--;
            }
        }
    }
    return arr;
}
console.log(unique1(arr));

     輸出結果和上例結果一致,在這裡需要注意的是splice(),它的本質是splice(index,len,[item]),index是陣列開始下標,len替換刪除元素的長度,[item]替換的值。

     利用indexOf()去重:

function unique2(arr) {
    /* 思路:1,建立新的空陣列;
    *        2,for迴圈遍歷去重的陣列;
    *        3,indexOf()查詢遍歷出的陣列在新的陣列是否出現,如果出現則繼續遍歷,如果未出現,則利用push方法新增到數組裡*/
var arr1 = [];
for(var i = 0; i < arr.length; i++){
    if(arr1.indexOf(arr[i]) == -1){
        arr1.push(arr[i]);
    }
}
return arr1;
}
var array = [4,5,6,77,8,8,,77,5];
console.log(unique2(array));

    注:indexOf()返回值,如果匹配到返回1,未匹配到返回-1。

控制檯輸出:

    利用sort()去重:

/*利用sort()去重*/
function unique3(arr){
    arr = arr.sort();
    var array = [arr[0]];
    for(var i = 1; i < arr.length; i++){   //因為不是從第一個元素開始的,所以i的初始值不能為0.
        if(arr[i] !== arr[i-1]){
            array.push(arr[i]);
        }
    }
    return array;
}
var arr3 = [11,33,66,8,8,5,33,11];
console.log(unique3(arr3));

控制檯輸出結果:

    利用 物件的屬性不能相同的特性進行陣列去重:

/*利用 物件的屬性不能相同的特性進行陣列去重*/
function unique4(arr){
    var array = [];
    var obj = {};
    for(var i = 0; i < arr.length; i++){
        if(!obj[arr[i]]){
            array.push(arr[i]);
            obj[arr[i]] = 1;
        }else{
            obj[arr[i]]++;
        }
    }
    return array;
}
var arr4 = ['a','a','b','c','n','d','d','s','n'];
console.log(unique4(arr4));

     控制檯輸出結果:

     利用includes()去重:

/*利用includes()去重*/
function unique5(arr) {
    var array = [];
    for(var i = 0; i < arr.length; i++){
        if(!array.includes(arr[i])){
            array.push(arr[i]);
        }
    }
    return array;
}
var arr5 = [100,50,45,90,100,4,50];
console.log(unique5(arr5));

    控制檯輸出結果:

    利用hasOwnProperty()去重:

 /*利用hasOwnProperty()去重*/
 function unique6(arr) {
     /*hasOwnProperty去重:判斷物件是否有某個特定的屬性,必須用字串指定該屬性。*/
     var obj = {};
     /*filter()對陣列中每個元素都執行一次指定的函式(callback()),並建立一個新的陣列*/
     return arr.filter(function (item,index,arr) {return obj.hasOwnProperty(typeof item + item)?false:(obj[typeof item + item] = true)  })
//callback(當前元素,當前元素索引,當前元素陣列對像)
 }
 var arr6 = [200,200,300,100,100,290,300];
 console.log(unique6(arr6));

    控制檯輸出結果:

    利用遞迴去重:

/*利用遞迴去重*/
function unique7(arr) {
    var arry = arr;
    var len = arry.length;
    arry.sort(function (a,b) {return a - b;})
    function loop(index){
        if(index >= 1){
            if(arry[index]===arry[index - 1]){
                arry.splice(index,1);
            }
            loop(index - 1);
        }
    }
    loop(len - 1);
    return arry;
}
var arr7 =[1,2,4,5,6,6,5,4,2];
console.log(unique7(arr7));

   控制檯輸出結果:

   利用Map資料結構去重:

/*利用map資料結構去重*/
function unique8(arr) {
    var map = new Map();
    var array = new Array();
    for(var i = 0; i < arr.length; i++){
        if(map.has(arr[i])){
            map.set(arr[i],true);
        }else{
            map.set(arr[i],false);
            array.push(arr[i]);
        }
    }
    return array;
}
var arr8 = [1,1,1,2,2,2,3,3,3];
console.log(unique8(arr8));

    控制檯輸出結果: