我正在使用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;
}
答案 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
现在具有您想要的百分比乘数。