Как улучшить конструкцию if else по сбору характеристик?

Как привести к более красивому виду код? Я реализовал через if else, но выглядит достаточно убого:

  const makeRecomendations = (wordsPerMinute, newAverage) => {
    if (wordsPerMinute  <= 119 && (newAverage >=5 && newAverage <=8) && output.length < 1) return 'Увеличьте скорость речи'
    else if (wordsPerMinute  <= 119 && newAverage <=5 && output.length < 1) return 'Увеличьте скорость речи\nГоворите громче'
    else if (wordsPerMinute  <= 119 && newAverage >=8 && output.length < 1) return 'Увеличьте скорость речи\nГоворите тише'
    else if (wordsPerMinute  <= 119 && (newAverage >=8) && output.length >= 1) return 'Увеличьте скорость речи\nГоворите тише\nКонтролируйте употребление слов паразитов'
    else if (wordsPerMinute  <= 119 && (newAverage <=5) && output.length >= 1) return 'Увеличьте скорость речи\nГоворите громче\nКонтролируйте употребление слов паразитов'
    else if (wordsPerMinute  <= 119 && (newAverage >=5 && newAverage <=8) && output.length >= 1) return 'Увеличьте скорость речи\nКонтролируйте употребление слов паразитов'
    else if (wordsPerMinute  >= 180 && (newAverage >=5 && newAverage <=8) && output.length < 1) return 'Не торопитесь во время доклада'
    else if ((wordsPerMinute >= 119 && wordsPerMinute <= 180)  && newAverage <=5 && output.length < 1) return 'Говорите громче'
    else if ((wordsPerMinute >= 119 && wordsPerMinute <= 180)  && newAverage >=8 && output.length < 1) return 'Говорите тише'
    else if ((wordsPerMinute >= 119 && wordsPerMinute <= 180)  && (newAverage >=5 && newAverage <= 8) && output.length >= 1) return 'Контролируйте употребление слов паразитов'
    else if ((wordsPerMinute >= 119 && wordsPerMinute <= 180)  && newAverage <=5 &&  output.length >= 1) return 'Говорите громче\nКонтролируйте употребление слов паразитов'
    else if (wordsPerMinute >=180  && newAverage <=5 &&  output.length >= 1) return 'Не торопитесь во время доклада\nГоворите громче\nКонтролируйте употребление слов паразитов'
    else if (wordsPerMinute >=180  && (newAverage >=5 && newAverage <= 8) &&  output.length < 1) return 'Не торопитесь во время доклада'
    else if (wordsPerMinute >=180  && (newAverage >=5 && newAverage <= 8) &&  output.length >= 1) return 'Не торопитесь во время доклада\nКонтролируйте употребление слов паразитов'
    else if (wordsPerMinute <= 119  && (newAverage >=5 && newAverage <= 8) &&  output.length >= 1) return 'Увеличьте скорость речи'
    else return "Вы потрясающий спикер!"

  }

Ответы (2 шт):

Автор решения: ksa

Предложу такой вариант с разделением проверок...

const output = ['значит', 'короче']
const makeRecomendations = (wordsPerMinute, newAverage) => {
  const a = []
  if (wordsPerMinute <= 119) a.push('Увеличьте скорость речи')
  if (wordsPerMinute >= 180) a.push('Не торопитесь во время доклада')
  if (newAverage <= 5) a.push('Говорите громче')
  if (newAverage >= 8) a.push('Говорите тише')
  if (output.length) a.push('Контролируйте употребление слов паразитов')
  if (a.length) return a.join('\n')
  return 'Вы потрясающий спикер!'
}

const mess = makeRecomendations(100, 4)
console.log(mess)

→ Ссылка
Автор решения: Andrei Khotko

В качестве разнообразия предложу еще вариант: можно создать массив recomendations, который будет содержать условие для рекомендации и сообщение. И в функции пройтись по этому массиву, поочередно проверяя условия.

const recomendations = [
  {
    condition: (wordsPerMinute, newAverage, output) => (wordsPerMinute  <= 119 && (newAverage >=5 && newAverage <=8) && output.length < 1),
    message: 'Увеличьте скорость речи',
  },
  {
    condition: (wordsPerMinute, newAverage, output) => (wordsPerMinute  <= 119 && newAverage <=5 && output.length < 1),
    message: 'Увеличьте скорость речи\nГоворите громче',
  },
  {
    condition: (wordsPerMinute, newAverage, output) => (wordsPerMinute  <= 119 && newAverage >=8 && output.length < 1),
    message: 'Увеличьте скорость речи\nГоворите тише',
  },
  // и т.д.
];

const noRecomendations = 'Вы потрясающий спикер!';

function makeRecomendations_v2(wordsPerMinute, newAverage) {
  for (let recomendation of recomendations) {
    if (recomendation.condition(wordsPerMinute, newAverage, output)) {
      return recomendation.message;
    }
  }

  return noRecomendations;
}

const recomendation = makeRecomendations_v2(119, 4);
→ Ссылка