2016-08-08 6 views
0

Javascriptを使用してGoogleシート用のカスタム関数を作成していますが、基本的にテーブルに基づいて値を返す必要があります。Javascriptルックアップ関数の最適化

私は動作するものがありますが、ネストされたif文では非常に醜いと感じています。読みやすさのためにこれをどのように改善できますか?

function price(msrp, order_quantity) 
{ 
    var percentage; 
    if(order_quantity >= 200 && order_quantity <= 400) { 
    if(msrp >=49 && msrp <= 99) { 
     percentage = 0.07; 
    } else if (msrp >=100 && msrp <= 249) { 
     percentage = 0.06; 
    } else if (msrp >=250 && msrp <= 499) { 
     percentage = 0.05; 
    } else if (msrp >=500) { 
     percentage = 0.04; 
    } else { 
     return null; 
    } 
    } else if (order_quantity >= 500 && order_quantity <= 900) { 
    if(msrp >=49 && msrp <= 99) { 
     percentage = 0.06; 
    } else if (msrp >=100 && msrp <= 249) { 
     percentage = 0.05; 
    } else if (msrp >=250 && msrp <= 499) { 
     percentage = 0.04; 
    } else if (msrp >=500) { 
     percentage = 0.03; 
    } else { 
     return null; 
    } 
    } else if (order_quantity >= 1000 && order_quantity <= 1400) { 
    if(msrp >=49 && msrp <= 99) { 
     percentage = 0.07; 
    } else if (msrp >=100 && msrp <= 249) { 
     percentage = 0.06; 
    } else if (msrp >=250 && msrp <= 499) { 
     percentage = 0.05; 
    } else if (msrp >=500) { 
     percentage = 0.04; 
    } else { 
     return null; 
    } 
    } else if (order_quantity >= 1500) { 
    if(msrp >=49 && msrp <= 99) { 
     percentage = 0.04; 
    } else if (msrp >=100 && msrp <= 249) { 
     percentage = 0.03; 
    } else if (msrp >=250 && msrp <= 499) { 
     percentage = 0.025; 
    } else if (msrp >=500) { 
     percentage = 0.015; 
    } else { 
     return null; 
    } 
    } else { 
    return null; 
    } 
    return msrp * percentage; 
} 
+0

は、401 ... 499と901 ... 999と1401 ... 1499の数量にギャップがあると奇妙に思えます。物事は少し複雑になりますが、あまり大きくはありません –

答えて

0

あなたは配列で、あなたのレベルのすべてを定義し、インスタンスArray.filterのために使用することができます

function price (msrp, order_quantity) { 
    var percentageLevels = [ 
       [0.07, 0.06, 0.05, 0.04], 
       [0.06, 0.05, 0.04, 0.03], 
       [0.04, 0.03, 0.025, 0.015] 
      ], 
      quantityLevels = [ 
       { min: 200, max: 400, percentages: percentageLevels[0] }, 
       { min: 500, max: 900, percentages: percentageLevels[1] }, 
       { min: 1000, max: 1400, percentages: percentageLevels[0] }, 
       { min: 1500, max: Number.MAX_VALUE, percentages: percentageLevels[2] } 
      ], 
      msrpLevels = [ 
       { min: 49, max: 99 }, 
       { min: 100, max: 249 }, 
       { min: 250, max: 499 }, 
       { min: 500, max: Number.MAX_VALUE } 
      ], 
      percentages = (quantityLevels.filter(function (q) { 
       return q.min <= order_quantity && order_quantity <= q.max; 
      })[0] || {}).percentages, 
      foundMsrp = percentages ? msrpLevels.filter(function (m, i) { 
       msrpLevels[i].percentage = percentages[i]; 

       return m.min <= msrp && msrp <= m.max; 
      })[0] : null; 

    if (!percentages || !foundMsrp) { 
     return null; 
    } 

    return msrp * foundMsrp.percentage; 
}; 

quantityLevels.filter()への呼び出しがあればquantityLevelはorder_quantityは、に落ち、そしてmsprLevels.filter()への呼び出しは、割合をマッピングしているでしょうそれぞれのmsprLevelに値を設定し、一致するレベルのみを返します。したがって、foundMsprに値がある場合は、foundMspr.percentageに必要なパーセンテージ乗数が追加されます。

0

あなたmsrp範囲がそれぞれorder_quantityの場合も同じですので、あなたはあなたの割合をインデックスによって1に三つの部分からそれを切ることができます。たとえば、あなたが言うことができる:

var pct = []; 
pct[0] = [0.07, 0.06, 0.05, 0.04]; 
pct[1] = [0.06, 0.05, 0.04, 0.03]; 
// don't need the third since it's the same as the first 
pct[2] = [0.04, 0.03, 0.025, 0.015]; 
var k, percentage; 
if (order_quantity >= 200 && order_quantity <= 400) k=0; 
else if (order_quantity >= 500 && order_quantity <= 900) k=1; 
else if (order_quantity >= 1000 && order_quantity <= 1400) k=0; 
else if (order_quantity >= 1500) k=2; 
else return null; 
if(msrp >=49 && msrp <= 99) percentage = pct[k][0]; 
else if (msrp >=100 && msrp <= 249) percentage = pct[k][1]; 
else if (msrp >=250 && msrp <= 499) percentage = pct[k][2]; 
else if (msrp >=500) percentage = pct[k][3]; 
else return null; 
return msrp * percentage; 

をそれはまだ最もエレガントな方法はありませんが、それは読み少し簡単です。