2011-07-13 9 views
1

要素の1つが配列内の項目と一致するときに配列を返したいとします。配列をループする最速の方法

配列のjavascript配列で値が一致する場合、以下のコードは配列をループする最も速い方法ですか?

注:パフォーマンス向上のために変数relatedVideosArrayを変更して別のデータ構造にするよう提案してください。

var relatedVideosArray = [ 

["1047694110001"], 
["1047694111001", "1019385098001","1020367665001","1020367662001", "1019385097001", "1020367667001"], 
["1040885813001"], 
["1019385094001", "1019385096001"], 
["952541791001", "952544511001", "952544512001", "952544508001", "952541790001","952580933001", "952580934001", "1051906367001"]           

] 


function getRelatedVideos(videoClicked){ 

    var tempStoreArray = [];  
    var getCurrentId = videoClicked;  
    var relVideoslen = relatedVideosArray.length; 

    for(var i in relatedVideosArray) { 
     tempStoreArray = relatedVideosArray[i]; 
     for(var j in tempStoreArray){    
       if(tempStoreArray[j] == getCurrentId){     
     return relatedVideosArray[i];     
     }    
     } 
    }  
} 

アップデート:私は最初にすべての関連IDなどの映像のIDと値のキーを作ることを考えたが、私はIDのいずれかの場合には、値の配列内のキーだけでなく、すべての関連のIDを表示したいですクリックします。これが私の制約を説明するのに役立つことを願っています。

+0

私は何か不足しているかもしれませんが、なぜあなたは 'tempStoreArray'を作成する必要がありますか?なぜ、単にrelatedVideosArray [i] 'をループしないのですか? – norway28

+0

if文を読みやすくした後にif文を作成しますが、それは重要ではありません。 – Igor

+0

リーンでスピーディーなコードが本当に必要な場合は、不要な変数を削除してください。 'relVideosLen'はまったく使われません。 'getCurrentId'は冗長です。単に' videoClicked'を直接使うことができるからです。 'tempStoreArray'が速度にどのような影響を与えているのかよく分かりませんが、私の目には読みにくく、簡単ではありません。どんな場合でも、値が決して使用されないので初期値を割り当てる必要はありません。 – nnnnnn

答えて

2

最新のブラウザではArray indexOfがサポートされています。

indexOfの配列が遅いと言う人は、速度に関する基本的なテストを行います。

var values = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20]; 

console.time("for"); 
for(var i=0;i<1000;i++){ 
    for(var j=0;j<=values.length;j++){ 
    if(values[j]===20) break; 
    } 
}  
console.timeEnd("for"); 

console.time("reverse for"); 
for(i=0;i<1000;i++){ 
    for(var j=values.length-1;j>=0;j--){ 
    if(values[j]===1) break; 
    } 
} 
console.timeEnd("reverse for"); 


console.time("while"); 
for(i=0;i<1000;i++){ 
    var j=0; 
    while (j<values.length){ 
    if(values[j]===20) break; 
    j++; 
    } 
} 
console.timeEnd("while"); 


console.time("reverse while"); 
for(i=0;i<1000;i++){ 
    var j=values.length-1; 
    while (j>=0){ 
    if(values[j]===1) break; 
    j--; 
    } 
} 
console.timeEnd("reverse while"); 


console.time("indexOf"); 
for(var i=0;i<1000;i++){ 
    var x = values.indexOf(20); 
} 
console.timeEnd("indexOf"); 

console.time("toString reg exp"); 
for(var i=0;i<1000;i++){ 
    var x = (/(,|^)20(,|$)/).test(values.toString); 
} 
console.timeEnd("toString reg exp"); 

2つの解決策:

var relatedVideosArray = [ 

["1047694110001"], 
["1047694111001", "1019385098001","1020367665001","1020367662001", "1019385097001", "1020367667001"], 
["1040885813001"], 
["1019385094001", "1019385096001"], 
["952541791001", "952544511001", "952544512001", "952544508001", "952541790001","952580933001", "952580934001", "1051906367001"]           

] 

//var getCurrentId = "1019385098001"; 
var getCurrentId = "1040885813001"; 


console.time("indexOf"); 
var tempStoreArray = []; 
for(var i = relatedVideosArray.length-1; i>=0; i--){ 
    var subArr = relatedVideosArray[i]; 
    if(subArr.indexOf(getCurrentId)!==-1){ 
     tempStoreArray.push(subArr); 
    } 
} 
console.timeEnd("indexOf"); 
console.log(tempStoreArray); 




console.time("toString reg exp"); 
var tempStoreArray = []; 
var re = new RegExp("(,|^)" + getCurrentId + "(,|$)"); 
for(var i = relatedVideosArray.length-1; i>=0; i--){ 
    var subArr = relatedVideosArray[i]; 
    if(re.test(subArr.toString())){ 
     tempStoreArray.push(subArr); 
    } 
} 
console.timeEnd("toString reg exp"); 
console.log(tempStoreArray); 
+0

質問のように配列をループするだけです...上記のサンプルコード以外は等価演算子を使用し、指定したリンクではID演算子を使用します。 – Paul

+0

さらに、IE 9の前ではサポートされていません。 – Perception

+0

JavaScriptのindexOfはfor/whileループよりも高速です。あなたが私を信じないなら、それを試してください。 – epascarello

1

私はあなたが現在の構造を維持していると思います。最初に配列を平坦化する方法がない限り、ネストされるのではなく、すべての値を持つ配列が1つだけあります。これがあなたのコントロールから外れているか実用的でない場合は、すべての要素とその要素を繰り返し処理する以外の方法はありません。

それ以外の場合は、値を地図に追加できますか?現在の動画IDがキーになり、値は関連する動画のリストになります。

1

あなたがデータ構造を管理している場合は、私は非常にあなたが実行している検索の種類により適し何かにそれを変更することをお勧めします。まず思いつくのは、連想配列の配列です。それぞれのビデオ配列は、ビデオIDでキー入力されます(値を任意の値に設定します)。それはあなたの検索をO(n)にします。ここでn =あなたが持っているビデオリストの総数です。

私はコンピュータの前でこのコードを投稿します。

関連する問題