Javascript-在嵌套if-else上进行改进

时间:2018-11-08 10:02:44

标签: javascript if-statement refactoring

我有一个可怕的嵌套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;
}

价格随着交易量的增加而下降。我该如何重构它以使其更易于维护/可读?

编辑:我尝试了一个开关,效果没有改善吗?

5 个答案:

答案 0 :(得分: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);

更多阅读内容:

答案 1 :(得分:2)

一种选择是使用定义阈值的数组,然后.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 :(得分: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。因此,不需要重复检查,因此可以省略。

答案 3 :(得分: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));

答案 4 :(得分:0)

如果使用如下所示的切换条件,我更愿意而不是很多

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

}