JAvascript配列の一意化の実現方法


インプリメンテーションモード
ここでは、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,232];
IE 7サイクル10000回:
arrayUnique 1は460 ms、arrayUnique 2は190 msである.
FF3.5サイクル100000回:
arrayUnique 1は170 ms、arrayUnique 2は63 msである.
試験結果から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を結合するのに少し差があることが試験された.