Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

Dúvida sobre o "[0]"

Olá pessoal, boa noite!

Abaixo segue o código que estou usando no curso de JavaScript,e ele está rodando perfeitamente. Consegui entender quase tudo, com exceção dos trechos onde aparecem o "[0]" => ("info-nome")[0]; ("info-peso")[0]; ("info-altura")[0]; e ("info-imc")[0];.

Gostaria de saber qual a finalidade do "[0]". Testei rodar o programa sem ele, ou com outros valores, e não rodou. Sempre deverá ter esse [0] em códigos JavaScript que lêem classes HTML? Existem situações onde ele não irá aparecer ou será diferente?

Desde já agradeço pela ajuda.

index.html

<!doctype html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Meus pacientes</title>
        <link rel="stylesheet" type="text/css" href="reset.css">
        <link rel="stylesheet" type="text/css" href="alura.css">
    </head>
    <body>
        <header>
            <div class="container">
                <h1>Meus pacientes</h1>
            </div>
        </header>
        <main class="container">
            <section>
                <h2>Meus pacientes</h2>
                <table>
                    <tr>
                        <th>Nome</th>
                        <th>Peso(kg)</th>
                        <th>Altura(m)</th>
                        <th>IMC</th>
                    </tr>
                    <tr class="paciente">
                        <td class="info-nome">Leonardo</td>
                        <td class="info-peso" id="peso-1">57</td>
                        <td class="info-altura" id="altura-1">1.67</td>
                        <td class="info-imc" id="imc-1"></td>
                    </tr>
                    <tr class="paciente">
                        <td class="info-nome">Paulo</td>
                        <td class="info-peso" id="peso-2">100</td>
                        <td class="info-altura" id="altura-2">2.00</td>
                        <td class="info-imc" id="imc-2"></td>
                    </tr>
                    <tr class="paciente">
                        <td class="info-nome">Stuart</td>
                        <td class="info-peso" id="peso-2">120</td>
                        <td class="info-altura" id="altura-2">1.80</td>
                        <td class="info-imc" id="imc-2"></td>
                    </tr>
                    <tr class="paciente">
                        <td class="info-nome">Rafael Vaz</td>
                        <td class="info-peso" id="peso-2">110</td>
                        <td class="info-altura" id="altura-2">1.60</td>
                        <td class="info-imc" id="imc-2"></td>
                    </tr>
                </table>
                <button id="calcula-imcs" class="botao ">Calcular Imcs</button>
            </section>
            <section>
                <h2>Adicionar novo paciente</h2>    
                <form>
                    <fieldset>
                        <label for="nome">Nome:</label>
                        <input id="campo-nome" type="text" placeholder="digite o nome do seu paciente">
                    </fieldset>
                    <fieldset class="campo-medio">
                        <label for="peso">Peso:</label>
                        <input id="campo-peso" type="text" placeholder="digite o peso do seu paciente">
                    </fieldset>
                    <fieldset class="campo-medio">
                        <label for="altura">Altura:</label>
                        <input id="campo-altura" type="text" placeholder="digite a altura do seu paciente">
                    </fieldset>
                    <button id="adicionar-paciente" class="botao bto-principal">Adicionar</button>
                </form>
            </section>
        </main>
        <script src="calcula-imc.js"></script>
    </body>
</html>

calcula-imc.js

var trsPacientes = document.getElementsByClassName("paciente");//Array de trs
//cria array com tamanho igual ao "número de pacientes"

for(var posicaoAtual = 0; posicaoAtual <= trsPacientes.length - 1; posicaoAtual++){
//roda o código do for "número de pacientes" vezes

    var pacienteTr = trsPacientes[posicaoAtual];
    var tdNome = pacienteTr.getElementsByClassName("info-nome")[0]; 
    var tdPeso = pacienteTr.getElementsByClassName("info-peso")[0]; 
    var tdAltura = pacienteTr.getElementsByClassName("info-altura")[0];
    //cria variáveis que são atualizada a cada laço do for

    var paciente = { nome : tdNome.textContent, 
                     peso : tdPeso.textContent, 
                     altura : tdAltura.textContent};
    //armazena os valores atuais das variáveis dentro de um objeto paciente

    //esse if utiliza os atributos do objeto recém criado
    if(paciente.altura != 0){
        var imc = paciente.peso / (paciente.altura * paciente.altura);

        var tdImc = pacienteTr.getElementsByClassName("info-imc")[0]; 
        tdImc.textContent = imc;

        console.log(imc); 

    }else{

        console("Não posso dividir por zero!");
    }

}
3 respostas
solução!

Todos os pontos do seu código onde é utilizado "[0]" é após a chamada da função getElementsByClassName. Essa função retorna um array de elementos, que ao utilizar o [0], você está acessando o indice zero desse array (ou primeira posição).

Para auxiliar no entendimento, seria a mesma coisa que:

var array = pacienteTr.getElementsByClassName("info-imc");

var primeiroItemDoArray = array[0];

Quer dizer que vc esta utilizando a primeira posição do array. Imagine que você tem 3 Nomes

Paulo, Carlos e João

1 - [0] = Paulo; 2 - [1] = Carlos; 3- [2] = João;

Marcelo e Gildson, obrigado pelas respostas.

Com a ajuda de vocês, consegui matar minha dúvida.

Reparei que o document.getElementsByClassName("paciente"); não precisa do "[0]" por estar lendo direto do HTML, apesar de estar criando um array.

Já no pacienteTr.getElementsByClassName("info-nome")[0]; , ele está lendo de dentro de um outro array, e pode existir mais de um elemento com a mesma class, daí a necessidade de especificar a posição.

Vou ver se nas próximas aulas, com mais exemplos de uso dessas funções, fica mais tranquilo de entender.

Obrigado e bom final de semana.