Javascript查找功能优化

时间:2016-08-08 10:05:55

标签: javascript google-sheets

我正在使用Javascript为我的Google表格编写自定义函数,它基本上应该根据表格返回值。

我有一些有用的东西,但是很多嵌套的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;
}

2 个答案:

答案 0 :(得分:0)

由于每个msrp案例的order_quantity范围相同,因此您可以通过索引百分比将其从三个部分减少到一个部分。例如,您可以说:

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;

它仍然不是最优雅的方法,但它更容易阅读。

答案 1 :(得分: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()的调用将找到order_quantity落入哪个quantityLevel,如果有的话,调用msprLevels.filter()将百分比值映射到每个msprLevel并且仅返回匹配的级别,因此您知道如果foundMspr有值,则foundMspr.percentage现在具有您想要的百分比乘数。