2011-09-14 46 views
1

私は価格マトリックスから幅と高さに応じてカーテン価格を計算する必要があります。 if文の代わりに配列からどのように計算できますか?Javascript price matrix array

function checkPrice() { 

     var price = calculatePrice();  

     function calculatePrice(price) { 

    var width = parseInt(document.getElementById('customid0').value); 
    var height = parseInt(document.getElementById('customid1').value); 

      // width up to 100 
      if (width <= 100){ 

      if (height <=50){       
      price = 67.22;       
      } 

      if (height >50 && height <=100){        
      price = 103.34;        
      } 

      if (height >100 && height <=130){       
      price = 133.11;        
      } 
      } 

      // width between 101 and 125 
      if (width > 100 && width <= 125){ 

      if (height <=50){       
      price = 76.69;       
      } 

      if (height >50 && height <=100){        
      price = 113.01;        
      } 

      if (height >100 && height <=130){       
      price = 146.05;      
      } 
      } 

      // width between 126 and 150 
      if (width > 125 && width <= 150){ 

      if (height <=50){       
      price = 83.69;       
      } 

      if (height >50 && height <=100){        
      price = 124.74;        
      } 

      if (height >100 && height <=130){       
      price = 161.28;      
      } 
      } 

       return price; 
      } 

document.getElementById('product_addtocart_form').action = '<?php echo $this->getAddToCartUrl($_product) ?>&price='+price; 
    optionsPrice.changePrice('options', price); 
    optionsPrice.reload(); 
    Price.changePrice(price); 
} 
+0

お金に小数点を使用しないでください。数式を実行した後に100を掛け、100で除算します。なぜ0.02と0.01を追加してみてください。 – Incognito

+0

ありがとうございます。 – Gumtee

+0

この宿題はありますか? – Incognito

答えて

1
var width = parseInt(document.getElementById('customid0').value, 10); 
var height = parseInt(document.getElementById('customid1').value, 10); 

var conditions = [ 
     [0, 100, [  // width = 0..100 
      [0, 50, [  //  height = 0..50 
       67.22  //   price = 67.02 
      ]], 
      [50, 100, [ //  height = 50..100 
       103.34 //   price = 103.34 
      ]], 
      [100, 130, [ //  height = 100..130 
       133.11 //   price = 133.11 
      ]] 
     ]], 
     [101, 125, [  // width = 101..125 
      [0, 50, [  //  height = 0..50 
       76.69  //   ... 
      ]], 
      [51, 100, [ 
       113.01 
      ]], 
      [101, 130, [ 
       146.05 
      ]] 
     ]], 
     [126, 150, [ 
      [0, 50, [ 
       83.69 
      ]], 
      [51, 100, [ 
       124.74 
      ]], 
      [101, 130, [ 
       161.28 
      ]] 
     ]] 
    ]; 

for (var w = 0, w_len = conditions.length; w < w_len; w += 1) 
{ 
    if (width >= conditions[w][0] && width <= conditions[w][1]) 
    { 
     for (var h = 0, h_len = conditions[w][2].length; h < h_len; h += 1) 
     { 
      if (height >= conditions[w][2][h][0] && height <= conditions[w][2][h][1]) 
      { 
       price = conditions[w][2][h][2]; 
       break; 
      } 
     } 
    } 
} 

Fiddle hereを確認してください。

+0

'min'、' max'、 'data'のある場所で、各グループにオブジェクトを作り易くするかもしれません。 – Incognito

+0

@Incognito:確かに、私は、多次元配列を使うよりも、データを保存して読み込むためのより良い方法があると思います。しかし、これは質問に対する答えです。私のアプローチが最適化できると思いますか? (常に配列について話しています) –

+0

'parseInt'は10進数のシステムに基数を設定していないので、8進数として解釈される傾向があります。私は実際にループの最適化を見ていない、あなたはその1ループを作る方法があるかもしれません。 – Incognito