JavaScript - 如何改进嵌套的if-else语句

5

我有一个可怕的嵌套if语句。将来可能会有更多的代码行。

if (people < 10) {
    price = 500;
} else if (people >= 10 && people < 25) {
    price = 350;
} else if (people >= 25 && people < 100) {
    price = 250;
} else if (people >= 100) {
    price = 200;
}

价格随着数量的增加而下降。如何重构它使得代码更易维护/易读?编辑:我尝试了一下switch,但没有改善?

是的,抱歉打错了。已经修正。 - TommyD
我试过了 switch.. 为什么你不喜欢它? - hindmost
1
将 (true) 传递给它似乎有点糊弄,而且与嵌套的 if 没有太大区别。 - TommyD
5个回答

4

一种选择是使用定义阈值的数组,然后 .find 在数组中找到适当的值。这将非常简洁,特别是在有大量阈值时:

const thresholds = [
  [100, 200], // need 100+ people for the price to be 200
  [25, 250], // else need 25+ people for the price to be 250
  [10, 350],
  [0, 500]
];
function findPrice(people) {
  return thresholds.find(([limit]) => people >= limit)[1];
}

console.log(findPrice(53)); // 53 people
console.log(findPrice(25));
console.log(findPrice(24));


2
除非你有成千上万个阈值并且每秒运行函数数百次,否则完全没有必要这样做。在99%的情况下,代码的可读性和简洁性更为重要。 - CertainPerformance
1
@AlexanderDavidson 我认为你失去的性能是值得维护性的。现在你有了一个对象迭代,你可以很容易地添加新的处理或新的阈值。我总是百分之百地更喜欢对象迭代而不是简单的if/else语句。 - Orelsanpls

3
您可以使用早期退出的函数。先前的检查是下一个检查或获取最大结果的条件。
优点是防止else if语句的链式使用,提供更好的可维护性。
function getPrice(people) {
    if (people < 10) {
        return 500;
    } 
    if (people < 25) {
        return 350;
    }
    if (people < 100) {
        return 250;
    }
    return 200;
}

var price = getPrice(people);

更多阅读:


你能详细说明一下你的答案吗?在单独的if块中返回结果比else if更好吗? - Ms.Tamil

1

当检查保持在这种形式时,您不需要检查>=

if (people < 10) {
    price = 500; 
} else if (people < 25) { 
    price = 350;
} else if (people < 100) { 
    price = 250; 
} else { 
    //people count is implicitly greater than 100
    price = 200; 
}

在每一步中,人数计数隐含地大于上一个检查,因此,例如,如果people < 10的结果为false,则该值隐含大于9或>= 10。因此,不需要重复检查,因此可以省略。

0

function applyConf(v) {
  return [{
    // false means infinite
    min: false,
    max: 9,
    value: 500,
  }, {
    min: 10,
    max: 24,
    value: 350,
  }, {
    min: 25,
    max: 99,
    value: 250,
  }, {
    min: 100,
    max: false,
    value: 200,
  }].find(({
    min,
    max,
  }) => (min === false || v >= min) && (max === false || v <= max)).value;
}

console.log(applyConf(-10));
console.log(applyConf(8));
console.log(applyConf(20));
console.log(applyConf(80));
console.log(applyConf(100));
console.log(applyConf(100000));


0

我更喜欢使用 switch 条件语句而非太多的 if 语句,如下所示

function getPrice(people)
{
    switch(true){
        case people<10: return 500;
        case people<25: return 350;
        case people<100: return 250;
        default: return 200;
    }

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接