1
resposta

[Dúvida] Meu IMC só está calculando o primeiro paciente!

var pacientes = document.querySelectorAll(".paciente");

for(var i = 0; i < pacientes.length ; i++){

var pacientes = pacientes[i];

var tdPeso = pacientes.querySelector(".info-peso");
var peso = tdPeso.textContent;

var tdAltura = pacientes.querySelector(".info-altura");
var altura = tdAltura.textContent;

let pesoValidar = true;
let alturaValidar = true;

if (peso <= 0 || peso >= 500) {
    tdPeso.textContent = "Peso inválido!"
    pesoValidar = false;
}

if (altura <= 0 || altura >= 3.00) {
    tdAltura.textContent = "Altura inválida!"
    alturaValidar = false;
}

if (pesoValidar && alturaValidar) {
    var tdImc = document.querySelector(".info-imc")
    var imc = peso / (altura * altura);
    tdImc.textContent = imc;
}

}

1 resposta

Fala, Cauan! Tudo bem?

Eu observei seu código e vou te passar um feedback do que notei que pode está inconsistente com o realizado pelo instrutor na aula.

Logo na primeira linha dentro do laço for quando você declara a variável pacientes tem um pequeno erro aí. O nome correto da variável é paciente. Como você fez a declaração com var, pode acabar sobrescrevendo a variável pacientes sem nem perceber. O certo seria:

var paciente = pacientes[i];

Outro ponto é a declaração da variável tdImc. Você fez a declaração dela dentro de um bloco if, e isso pode causar erros por conta do escopo. Eu sugiro que declare essa variável logo abaixo da variável altura, assim:

var tdImc = document.querySelector(".info-imc")

Continuando, dentro dos blocos if em que você verifica o peso e a altura, para saber se eles são válidos, está utilizando a variável tdPeso e a variável tdAltura para exibir uma mensagem de erro. Mas o correto seria usar a variável tdImc, assim:

//...
if (peso <= 0 || peso >= 500) {
    tdImc.textContent = "Peso inválido!"
    pesoValidar = false;
}

if (altura <= 0 || altura >= 3.00) {
    tdImc.textContent = "Altura inválida!"
    alturaValidar = false;
}
//...

Pois o elemento onde você exibe a mensagem de peso ou altura Inválida é o no tdImc.

E no último bloco if, onde você faz efetivamente o cálculo do IMC, você está declarando o tdImc aqui, por isso o erro acontece, por uma questão de escopo local. Como sugerido, você pode declarar a fora, tdImc e não terá mais esse problema.

Inclusive pode arredondar as casas decimais do cálculo do IMC para apenas 2, desse jeito

  if (pesoValidar && alturaValidar) {
    var imc = peso / (altura * altura);
    tdImc.textContent = imc.toFixed(2);
  }

E é isso!

O código final deve ser parecido com esse aqui:


for (var i = 0; i < pacientes.length; i++) {
  var paciente = pacientes[i];

  var tdPeso = paciente.querySelector(".info-peso");
  var tdAltura = paciente.querySelector(".info-altura");

  var tdImc = paciente.querySelector(".info-imc");

  var peso = tdPeso.textContent;
  var altura = tdAltura.textContent;


  let pesoValidar = true;
  let alturaValidar = true;


  if (peso <= 0 || peso >= 1000) {
    console.log("Peso inválido");
    tdImc.textContent = "Peso inválido!";
    pesoValidar = false;
  }

  if (altura <= 0 || altura >= 3.0) {
    console.log("Altura inválida");
    tdImc.textContent = "Altura inválida!";
    alturaValidar = false;
  }

  if (pesoValidar && alturaValidar) {
    var imc = peso / (altura * altura);
    tdImc.textContent = imc.toFixed(2);
  }
}

Abração!