2011-09-14 119 views
1

我需要根据价格矩阵计算窗帘价格,这取决于宽度和高度。如何从数组中计算而不是if语句?Javascript价格矩阵数组

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'不是将基数设置为十进制系统,你很容易将它解释为一个八进制数。我没有真正看过循环的优化,你可能有办法做出这个单循环。 – Incognito