JAvascript配列の一意化の実現方法
3031 ワード
インプリメンテーションモード
ここでは、2つの実装形態を示す.一つは誰もが知っているはずのindexOf検出方式であり,もう一つはlastIndexOfとspliceを組み合わせた実現方式である.
テスト結果
試験データ: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には実装方法があります.具体的なコードを見てみましょう.
これは、一時的なオブジェクトを作成し、要素のIDを取得してオブジェクトのkeyに保存します.しかし、この実装方式はオブジェクトにのみ適用され、通常の直接量(例えば、数字、文字列など)には役に立たない.さらに,この方式は実行速度においてlastIndexOfとspliceを結合するのに少し差があることが試験された.
ここでは、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を結合するのに少し差があることが試験された.