Javascript - улучшение вложенного if-else

У меня ужасный вложенный 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;
}

Цена снижается по мере увеличения объема. Как мне реорганизовать это, чтобы сделать его более удобным для сопровождения / чтения?

Обновлено: я попробовал переключатель, и он не стал лучше?

Да извините за опечатку. Фиксированный.

AlexanderDavidson 08.11.2018 11:07
Я попробовал выключатель .. А почему не понравилось?
hindmost 08.11.2018 11:09

Передача (true) в него казалась немного хакерской, плюс было небольшое отличие от вложенного if.

AlexanderDavidson 08.11.2018 20:07
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
5
3
277
5

Ответы 5

Вы можете взять функцию с ранним выходом. Предыдущая проверка является условием следующей проверки или получения максимального результата.

Преимущество состоит в том, чтобы предотвратить цепочки заявлений 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?

Ms.Tamil 08.11.2018 11:09

Что ж, вам не нужен чек для >=, когда чек останется в такой форме:

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.

Ms.Tamil 08.11.2018 11:10

Один из вариантов - использовать массив, который определяет пороги, а затем .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% ситуаций.

CertainPerformance 08.11.2018 11:15

@AlexanderDavidson Я думаю, что потеря производительности стоит ее ремонтопригодности. Теперь, когда у вас есть итерация объекта, вы можете легко добавить новую обработку или новый порог. Я бы на 100% всегда предпочел бы итерацию объекта простым операторам if / else

Orelsanpls 08.11.2018 11:16

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;
    }

}

Другие вопросы по теме