У меня ужасный вложенный 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;
}
Цена снижается по мере увеличения объема. Как мне реорганизовать это, чтобы сделать его более удобным для сопровождения / чтения?
Обновлено: я попробовал переключатель, и он не стал лучше?
Передача (true) в него казалась немного хакерской, плюс было небольшое отличие от вложенного if.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вы можете взять функцию с ранним выходом. Предыдущая проверка является условием следующей проверки или получения максимального результата.
Преимущество состоит в том, чтобы предотвратить цепочки заявлений 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 лучше, чем в другом if?
Что ж, вам не нужен чек для >=, когда чек останется в такой форме:
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. По этой причине повторная проверка не требуется, поэтому ее можно не проводить.
Просто, но эффективно. +1.
Один из вариантов - использовать массив, который определяет пороги, а затем .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.info(findPrice(53)); // 53 people
console.info(findPrice(25));
console.info(findPrice(24));Вовсе нет, если у вас нет чего-то вроде тысячи пороговых значений. а также запускает функцию сотни раз в секунду или что-то в этом роде. Читаемость и лаконичность кода важнее в 99% ситуаций.
@AlexanderDavidson Я думаю, что потеря производительности стоит ее ремонтопригодности. Теперь, когда у вас есть итерация объекта, вы можете легко добавить новую обработку или новый порог. Я бы на 100% всегда предпочел бы итерацию объекта простым операторам if / else
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.info(applyConf(-10));
console.info(applyConf(8));
console.info(applyConf(20));
console.info(applyConf(80));
console.info(applyConf(100));
console.info(applyConf(100000));Я бы предпочел вместо многих, если бы использовать условие переключения, как показано ниже
function getPrice(people)
{
switch(true){
case people<10: return 500;
case people<25: return 350;
case people<100: return 250;
default: return 200;
}
}
Да извините за опечатку. Фиксированный.