javascript數組唯一化實現方式

到目前為止,javascript中array還沒有內置的unique方法,本來這篇文章很早就寫了,但由于之前的虛擬主機忘記續費導致數據丟了,前幾天JerryQu問了我這個問題,覺得可能還有其他人要,這里在寫出來,備大家參考。

實現方式

這里給出2中實現方式。一種是大家應該都知道的indexOf檢測的方式,另一種是結合lastIndexOf和splice實現方式。

//首先給Array對象原型上添加indexOf和lastIndexOf方法.(如果沒有的話)
    if(!Array.prototype.indexOf){
        Array.prototype.indexOf = function(element, index){
            var length = this.length;
            if(index == null){
                index = 0;
            }else{
                index = +index || 0;
                if(index < 0) index+= length;
                if(index < 0) index = 0;
            }
            for(var current;index<length;index++){
                current = this[index];
                if(current === element) return index;
            }
            return -1;
        }
    }
    if(!Array.prototype.lastIndexOf){
        Array.prototype.lastIndexOf = function(element, index){
            var length = this.length;
            if(index == null){
                index = length - 1;
            }else{
                index = +index || 0;
                if(index < 0) index+= length;
                if(index < 0) index = -1;
                else if(index >= length) index = length - 1;
            }
            for(var current;index>=0;index--){
                current = this[index];
                if(current === element) return index;
            }
            return -1;
        }
    }
    //很常見的實現方式
    var arrayUnique1 = function(arr){
        for(var i=0,len=arr.length,result=[],item;i<len;i++){
            item = arr[i];
            if(result.indexOf(item) < 0) {
                result[result.length] = item;
            }
        }
        return result;
    }
    //通過lastIndexOf和splice方法實現方式
    var arrayUnique2 = function(arr){
        var length = arr.length;
        while(--length){
                    //如果在前面已經出現,則將該位置的元素刪除
            if(arr.lastIndexOf(arr[length],length-1) > -1) {
                arr.splice(length,1);
            }
        }
        return arr;    
    }

測試結果

測試數據:var arr = [1,2,3,1,2,3,2,1,3,4,2,232]; IE7循環10,000次: arrayUnique1為460ms,arrayUnique2為190ms。 FF3.5循環100,000次: arrayUnique1為170ms,arrayUnique2為63ms。

從測試結果上可以看出,通過lastIndexOf和splice的方式的速度是普通方式的2-3倍。

其他實現方式

除了上面描述的2中實現方式外,其實還是有其他實現方式的。jQuery中就一種實現方式。我們可以看下具體的代碼:

unique: function( array ) {
        var ret = [], done = {};
        try {
            for ( var i = 0, length = array.length; i < length; i++ ) {
                var id = jQuery.data( array[ i ] );
                if ( !done[ id ] ) {
                    done[ id ] = true;
                    ret.push( array[ i ] );
                }
            }
        } catch( e ) {
            ret = array;
        }
        return ret;
    }

這種是通過創建一個臨時的對象,然后獲取元素的ID保存在對象的key中。但這種實現方式只能針對對象,對于普通的直接量(如:數字,字符串等)是無用的。并且經過測試,這種方式在執行速度上和lastIndexOf結合splice還是有點差距的。


所屬標簽

無標簽

25选5玩法中奖