Нужно получить значение после расчета калькулятора

Рейтинг: -1Ответов: 1Опубликовано: 05.04.2023

Написана функция рассчёта каллорий, необходимо вывести значение белков в отдельную переменную, пробовал через return, но в консоле отображается undefined

  const result = document.querySelector("#callories span"),
    resultProtein = document.querySelector("#protein span");
  let sex = "female",
    height,
    weight,
    age,
    ratio = 1.2;

  function calcTotal() {
    if (!sex || !height || !weight || !age || !ratio) {
      result.textContent = "____"; //
      resultProtein.textContent = "____";
      return;
    }
    //для женщин: 10*вес (кг) + 6,25*рост (см) – 5*возраст (г) – 161.
    // для мужчин: 10*вес (кг) + 6,25*рост (см) – 5*возраст (г) + 5;

    if (sex === "female") {
      result.textContent = Math.round(
        (10 * weight + 6.25 * height - 5 * age - 161) * ratio
      );
      resultProtein.textContent = Math.round(
        ((10 * weight + 6.25 * height - 5 * age - 161) * ratio) / 4
      );
    } else {
      result.textContent = Math.round(
        (10 * weight + 6.25 * height - 5 * age + 5) * ratio
      );
      resultProtein.textContent = Math.round(
        ((10 * weight + 6.25 * height - 5 * age + 5) * ratio) / 4
        //каллорий с учетом активности / 4
      );
      return resultProtein;
    }
  }
  calcTotal();
  let res = calcTotal();
  console.log(res);```

Ответы

▲ 2

У вас как минимум 2 проблемы в коде:

  1. Уже упомянутая в коментариях: второй IF возвращает результат только если условие sex === "female" не равно true
  2. Ваша функция всегда будет возвращать undefined, т.к. в самом начале у вас идет проверка if (!sex || !height || !weight || !age || !ratio) {, которая всегда будет срабатывать, т.к. проверяемые переменные (height, weight и age) у вас не заданы.

Ну и как уже упомянул в комментарии, лучше разделить логику рассчета и вывода данных. Возможно из-за этого вы запутались.

Как вариант можно сделать так:

const result = document.querySelector("#callories span"),
  resultProtein = document.querySelector("#protein span");

// Эти переменные у вас небыли заполнены (в примере). В этом была основная причина undefined
let sex = "female",
  height=170,
  weight=80,
  age=30,
  ratio = 1.2;


function calcTotal(sex, height, weight, age, ratio) {
  //для женщин: 10*вес (кг) + 6,25*рост (см) – 5*возраст (г) – 161.
  // для мужчин: 10*вес (кг) + 6,25*рост (см) – 5*возраст (г) + 5;
  let calories, protein
  if (sex === "female") {
    calories = Math.round(
      (10 * weight + 6.25 * height - 5 * age - 161) * ratio
    );
    protein = Math.round(
      ((10 * weight + 6.25 * height - 5 * age - 161) * ratio) / 4
    );
  } else {
    calories = Math.round(
      (10 * weight + 6.25 * height - 5 * age + 5) * ratio
    );
    protein = Math.round(
      ((10 * weight + 6.25 * height - 5 * age + 5) * ratio) / 4
      //каллорий с учетом активности / 4
    );
  }

  return { calories, protein };
}

// Проверяем заполнены ли все необходимые переменные. Если нет, выводим ошибку в консоль
if (!sex || !height || !weight || !age || !ratio) {
  result.textContent = "____"; //
  resultProtein.textContent = "____";
  console.error("Один или несколько параметров рассчета не заданы")
} 
// иначе делаем расчеты
else {
  const { calories, protein } = calcTotal(sex, height, weight, age, ratio);
  console.log(calories, protein);
  
  result.textContent = calories
  resultProtein.textContent = protein
}
<div id="callories">
<span></span>
</div>

<div id="protein">
<span></span>
</div>