За свою карьеру разработчика я несколько раз сталкивался с ужасными конструкциями if-else. Я почти никогда не сталкивался с примером, вы не могли бы реорганизовать гораздо более простое решение. Ниже я покажу вам, как реорганизовать очень распространенную конструкцию.

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

Для простоты следующий код, который сейчас создали бы многие разработчики, демонстрирует только мужчин.

function getWeightClassMen(weight) {
  if (typeof weight !== number) return undefined;
  if (weight >= 46 && weight <= 48) return 'Minimumweight';
  else if (weight >= 48 && weight <= 51) return 'Flyweight';
  else if (weight >= 51 && weight <= 54) return 'Bantamweight';
  else if (weight >= 54 && weight <= 57) return 'Featherweight';
  else if (weight >= 57 && weight <= 60) return 'Lighweight';
  else if (weight >= 60 && weight <= 63.5) return 'Light Welterweight';
  else if (weight >= 63.5 && weight <= 67) return 'Welterweight';
  else if (weight >= 67 && weight <= 71) return 'Light Middleweight';
  else if (weight >= 71 && weight <= 75) return 'Middleweight';
  else if (weight >= 75 && weight <= 80) return 'Light Heavyweight';
  else if (weight >= 80 && weight <= 86) return 'Cruiserweight';
  else if (weight >= 86 && weight <= 92) return 'Heavyweight';
  else if (weight >= 92) return 'Super Heavyweight';
  else undefined;
}

Данг. Это очень многословно и подвержено ошибкам. Многие разработчики не понимают, что основная логика этого кода может быть написана без всех этих условий if. Что нам нужно?

Сначала определите отсортированную таблицу сопоставления, содержащую все данные.

var menWeightClasses = {
  46: 'Minimumweight',
  48: 'Flyweight',
  51: 'Bantamweight',
  54: 'Featherweight',
  57: 'Lighweight',
  60: 'Light Welterweight',
  63.5: 'Welterweight',
  67: 'Light Middleweight',
  71: 'Middleweight',
  75: 'Light Heavyweight',
  80: 'Cruiserweight',
  86: 'Heavyweight',
  92: 'Super Heavyweight'
}

Теперь все, что нам нужно сделать, это найти ключ пола в этой таблице и вернуть его значение.

function getWeightClassMen(weight) {
  if (typeof weight !== number) return undefined;
  var floorKey = Object.keys(menWeightClasses).findLast(
    key => key <= weight);
  
  return floorKey ? menWeightClasses[floorKey] : undefined;
}

Просто, верно? Эту функцию можно легко расширить для женских классов, просто решив, какую таблицу поиска использовать.