javascript數組查重方法總結


文章參考地址:http://blog.csdn.net/chengxuyuan20100425/article/details/8497277


題目

對下列數組去重:
var arr = ['aa','bb','cc','',1,0,'1',1,'bb',null,undefine,null];
要求考慮兼容性和效率

方法一
function unique(arr){
    var result = [];
    for (var i = 0;i<arr.length;i++){
        //如果當前數組的第i項已經保存進了臨時數組,忽略掉
        //否則的話把當前項push到臨時數組里面
        if(result.indexOf(arr[i]) < 0)  result.push(arr[i]);
        //indexOf 返回元素在result中的位置,如果沒有返回-1;
    }
    return result;
}
var arr = ['aa','bb','cc','',1,0,'1',1,'bb',null,undefine,null];
console.log(unique(arr));

總結:兩個問題:1.加上indexOf()相當於加載兩次循環
2.indexOf()在ie9以下不兼容

方法二
function unique(arr){
    var result = [];
    var hash = {};
    for ( var i=0;i<arr.length;i++){
        var key = (typeof arr[i]) + arr[i];
        if(!hash[key]){
            result.push(arr[i]);
            hash[key] = true;
        }
    }
    return result;
}
var arr = ['aa','bb','cc','',1,0,'1',1,'bb',null,undefine,null];
console.log(unique(arr));

通過hash表,把已經出現過的元素通過下標的形式存入一個object內。下標的引用比indexOf搜索數組快的多。

方法三
function unique(arr){
    var n = [this[0]];   //結果數組
    for(var i =1;i<this.length;i++){   //從第二項開始遍歷
        //如果當前數組的第i項在當前數組中第一次出現的位置不是i
        //那么表示第i項是重復的,忽略掉。否則存入結果數組
        if(this.indexOf(this[i]) == i)  n.push(this[i]);
    }
    return n;
}
var arr = ['aa','bb','cc','',1,0,'1',1,'bb',null,undefine,null];
console.log(unique(arr));

方法四
function unique(arr){
    this.sort();
    var re = [this[0]];
    for (var i =1;i<this.length;i++){
        if( this[i]  != re[re,length-1] ){
            re.push(this[i]);
        }
    }
}
var arr = ['aa','bb','cc','',1,0,'1',1,'bb',null,undefine,null];
console.log(unique(arr));

先把數組排序,然后比較相鄰的兩個值。

方法五
//去重(ES6 Set)
function unique2(array){
return Array.from(new Set(array));
}
var arr = ['aa','bb','cc','',1,0,'1',1,'bb',null,undefine,null];
console.log(unique(arr));

ES6 新方法 form,所以兼容性有問題。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM