首先,说一下为什么要对多层if,else进行优化:
- 多次使用
if...else
语句可能会导致代码嵌套过深,从而影响代码的可读性和可维护性。当if...else
语句嵌套过多时,代码会变得难以理解和调试,容易出现错误。 - 使用多个
if...else
语句可能会导致代码重复,从而增加代码的维护成本。如果多个if...else
语句中有相同的代码块,那么这些代码块需要被重复编写,这会增加代码的复杂度和维护成本。
优化方式:
- 早期返回方式:
function calculatePrice(quantity, price) {
if (quantity< 0) {
return null;
}
if (quantity < 10) {
return quantity * price;
}
if (quantity < 50) {
return quantity * price * 0.9;
}
return quantity * price * 0.8;
}
在上面的代码中,如果输入的数量小于0,直接返回null,每一层if,符合条件就会直接return出去,这样就避免了后面的if-else语句的嵌套。
- 对象字面量:
const discount = {
0: (quantity, price) => quantity * price,
10: (quantity, price) => quantity * price * 0.9,
50: (quantity, price) => quantity * price * 0.8,
};
function calculatePrice(quantity, price) {
const key = Object.keys(discount).find((key) => quantity < key);
return discount[key](quantity, price);
}
在上面的代码中,使用了对象字面量的方式,将不同的折扣函数存储在一个对象中。通过查找对象中第一个大于输入数量的键,来获取对应的折扣函数。
- 函数式编程方式:
function calculatePrice(quantity, price) {
const discount = quantity < 10 ? 1 : quantity < 50 ? 0.9 : 0.8;
return quantity * price * discount;
}
在上面的代码中,使用了函数式编程的方式,通过三元运算符来计算折扣,避免了大量的if-else语句。
- Map数据结构方式:
const discount = new Map([
[0, (quantity, price) => quantity * price],
[10, (quantity, price) => quantity * price * 0.9],
[50, (quantity, price) => quantity * price * 0.8],
]);
function calculatePrice(quantity, price) {
const key = Array.from(discount.keys()).find((key) => quantity < key);
return discount.get(key)(quantity, price);
}
在上面的代码中,使用了Map数据结构的方式,将不同的折扣函数存储在一个Map中。通过查找Map中第一个大于输入数量的键,来获取对应的折扣函数。
小结:
最近在做的项目中,需要进行大量的条件判断,一开始就是只会用if,else,else if,这种多层的判断,后来写完了后发现,项目中这种判断太多了,后期维护起来非常困难,所以就参考了一下各种解决方式,最后总结出上面四种方式,代码维护起来省略很多麻烦,定位问题也不用一层一层走一遍,就很方便🤭