JavaScript數組去重最佳選擇

數組值只包含了字符和數字,更多類型增長不會影響如下method_*的排序(時間排序)javascript

測試環境:版本 57.0.2987.133 (64-bit)java

var arr1 = [1, 1, 2, 2, 3, 4, 4, 5, 5, 6, 1, 2, 3, 4, 5, 6, "1", "2", "1", "2"];
var arr2 = [1, 1, 2, 2, 3, 4, 4, 5, 5, 6, 1, 2, 3, 4, 5, 6];

while(arr1.length < 600000){

    arr1 = arr1.concat(arr1);
    arr2 = arr2.concat(arr2);
}
// 
// 
// 
// method_1:新建數組-雙循環-對比-push
Array.prototype.unique = function(){

    var res = [this[0]],
        len = this.length;

    for(var i = 1; i < len; i ++){

        var repeat = false,
            rlen     = res.length;

        for (var j = 0; j < rlen; j ++){

            if(this[i] === res[j]){

                repeat = true;
                break;
            }
        }

        !repeat && res.push(this[i]);
    }

    return res;
}

var timestamp = new Date().getTime();
arr1 = arr1.unique();
console.log(new Date().getTime() - timestamp); // 平均 18

var timestamp = new Date().getTime();
arr2 = arr2.unique();
console.log(new Date().getTime() - timestamp); // 平均 10
// 
// 
// 
// method_2:新建數組-排序-單循環-對比-push
Array.prototype.unique = function () {
 
    this.sort(function (a, b) {
     
        if (typeof a != typeof b && a == b) {
     
            if (typeof a == "number") {
                return -1;
            } else {
                return 1
            }
        }
        return parseInt(a) - parseInt(b);
    })

    var res = [this[0]],
        len = this.length;

    for (var i = 1; i < len; i ++) {

        var slen = res.length;


        if (this[i] !== res[slen -1]) {

            res.push(this[i]);
        }
    }

    return res;
}

var timestamp = new Date().getTime();
arr1 = arr1.unique();
console.log(new Date().getTime() - timestamp); // 平均 121

var timestamp = new Date().getTime();
arr2 = arr2.unique();
console.log(new Date().getTime() - timestamp); // 平均 93
// 
// 
// 
// method_3:新建數組-新建對象-單循環-對象對比-數組push 
Array.prototype.unique = function () {

    var res = [],
        obj = {},
        len = this.length;

    for (var i = 0; i < len; i++) {

        // 因爲對象屬性爲字符串 1 和 "1" 相同,所以作不到 ===
        !obj[this[i]] && res.push(this[i]) && (obj[this[i]] = 1);

    }
    return res;
}
var timestamp = new Date().getTime();
arr1 = arr1.unique();
console.log(new Date().getTime() - timestamp); // 平均 8

var timestamp = new Date().getTime();
arr2 = arr2.unique();
console.log(new Date().getTime() - timestamp); // 平均 5
// 
// 
// method_4:新建數組-循環-向後查詢-數組push
Array.prototype.unique = function () {
 
    var res = [],
        len = this.length,
        i, j;
    for (i = 0; i < len; i++) {

        for (j = i + 1; j < len; j++) {

            if (this[i] === this[j]) {

                j = false;
                break;
            }
        }
        
        j && res.push(this[i]);
    }
    
    return res;
}
var timestamp = new Date().getTime();
arr1 = arr1.unique();
console.log(new Date().getTime() - timestamp); // 平均 28

var timestamp = new Date().getTime();
arr2 = arr2.unique();
console.log(new Date().getTime() - timestamp); // 平均 17
// 
// 
// 
// method_4:使用Set
Array.prototype.unique = function (){

    var arr = new Set(this);

    return [...arr];
}
var timestamp = new Date().getTime();
arr1 = arr1.unique();
console.log(new Date().getTime() - timestamp); // 平均 75

var timestamp = new Date().getTime();
arr2 = arr2.unique();
console.log(new Date().getTime() - timestamp); // 平均 60
// 
// 
// 
// method_5:使用find/findIndex/indexOf
Array.prototype.unique = function(){

    var res = [this[0]],
        len = this.length;

    for(var i = 1; i < len; i ++){

        var repeat = false,
            rlen     = res.length;

        if(!res.find((v,k)=>{return v === this[i]})){
            
            res.push(this[i]);
        }

        // if(res.indexOf(this[i]) == -1){

        //     res.push(this[i]);   
        // }

        // if(res.findIndex((v,k)=>{return v === this[i]}) == -1){
            
        //     res.push(this[i]);
        // }
    }

    return res;
}
var timestamp = new Date().getTime();
arr1 = arr1.unique();
console.log(new Date().getTime() - timestamp); // 平均 110+

var timestamp = new Date().getTime();
arr2 = arr2.unique();
console.log(new Date().getTime() - timestamp); // 平均 65+

總結

method_1時間爲 18 /10 ,循環對比。數組

method_2時間爲 121/93 , 若是依賴sort排序(在字符和數字組合中更是依賴sort callback)大大增長的時間,而且影響了原有數組順序。數據結構

method_3時間爲 8/5 , 沒法區分字符和數字。測試

method_4時間爲 28/7 ,同method_1爲循環對比,可是增長了內層循環次數。this

method_5時間爲 75/60 , 使用Set數據結構特性。prototype

method_5時間爲 110+/65+ , 使用find/findIndex/indexOf判斷。code

整體來講最佳選擇爲 method_1 對象

可是推薦使用method_5----大道至簡排序

相關文章
相關標籤/搜索