2012-05-08 10 views
1

I次のJavaScriptコードを持っている:避ける、ループの最適化、無駄な検索

var postcodes = [['BD1',8],['BD2',20],['BD7',30]]; 

    var rangeColours = [['red',10],['black',20],['blue',30]]; 

    var postcodeColours = []; 

    for(var i=0; i<postcodes.length; i++) { 
     var match = 0; 
     for(var x=0; x<rangeColours.length; x++) { 
      if(postcodes[i][1] <= rangeColours[x][1] && match == 0){ 
       postcodeColours.push([postcodes[i][0],rangeColours[x][0]]); 
       match = 1; 
      } 
     } 
    } 

コードの出力は次のようになります。

[BD1,red][BD2,black][BD7,blue] 

私が好きな(ちなみに罰金です) 2番目のforループで発生する無駄なルックアップを減らすことに関して、コードをより効率的にする方法があるかどうかを知るためには?現時点では、postcodes配列要素の値がrangeColours配列要素の値よりも小さい場合は、「一致」変数を使用して1に設定して、プッシュコードが各ポストコード配列要素に対して繰り返されないようにします。これを行うよりエレガントな方法がありますか?

多くのおかげ

+0

「rangeColours」はどのように続きますか?10ずつ増やしていきますか?そうであれば、内部ループを完全になくすことができます。 –

+0

@cliffsofinsanityいいえ、任意の数の値を含めることができます、ありがとうございます。 –

答えて

4

あなたが本当に検索を最適化したい場合は、ローカル

for(var i=0; i<postcodes.length; i++) { 
    var postcodeCurrent = postcodes[i]; 
    var match = 0; 
    for(var x=0; x<rangeColours.length; x++) { 
     var rangeColourCurrent = rangeColours[x]; 
     if(postcodesCurrent[1] <= rangeColoursCurrent[1] && match == 0){ 
      postcodeColours.push([postcodesCurrent[0],rangeColoursCurrent[0]]); 
      match = 1; 
     } 
    } 
} 

でそれをスタッシュによってループ本体内postcodes[i]rangeColours[x]の冗長検索を削除することができ、この場合、私はわかりませんよパフォーマンスに大きな影響を与えます。それはマイクロ最適化のような感じです。

1

あなたは確かにこのような何かを行うことができ:あなたがしたら

for(var i=0; i<postcodes.length; i++) { 
    var match = 0, 
     codes = postcodes[i], 
     coloursLength = rangeColours.length; 
    for(var x=0; x<coloursLength; x++) { 
     var colours = rangeColours[x]; 
     if(codes[1] <= colours[x][1] && match == 0){ 
      postcodeColours.push(codes[0], colours[0]); 
      match = 1; 
     } 
    } 
} 
2

使用して、break文を

for(var i=0; i<postcodes.length; i++) { 
    for(var x=0; x<rangeColours.length; x++) { 
     if(postcodes[i][1] <= rangeColours[x][1]){ 
      postcodeColours.push([postcodes[i][0],rangeColours[x][0]]); 
      break; 
     } 
    } 
} 
+0

これは、コード内で変更する必要がある最初のものです。 –

+0

ええ、私にとって、他のものは、コンパイラ自体が行う可能性のあるマイクロ最適化のようです(それについてはわかりません)。そして、このコードははるかに読みやすいようです。 –

0

のではなく、あなたのmatch変数やbreakを使用して、あなたはxの値を設定することができますあなたの試合が見つかりました。

for(var i=0; i<postcodes.length; i++) { 
    for(var x=0; x < rangeColours.length; x++){ 
     if(postcodes[i][1] <= rangeColours[x][1]){ 
      postcodeColours.push([postcodes[i][0],rangeColours[x][0]]); 
      x = rangeColours.length; 
     } 
    } 
} 
+1

なぜbreakステートメントでそれを使用しますか? –

関連する問題