1
resposta

Não entendi a lógica

Não entendi a lógica nessa parte que é criado o if no laço for. O Rodrigo fala "Temos que verificar se o i, que representa o índice, já chegou ao final, ou seja, já chegou no amigos.length." Não entendi porque chegar ao final do length vai resolver o problema do undefined na hora do sorteio. Também não entendi porque o "0" colocado em amigos[0] vai mudar alguma coisa. Alguém pode me ajudar, por favor? Não ficou claro.

//código omitido

for (let i = 0; i < amigos.length; i++) {
    if (i == amigos.length) {
        sorteio.innerHTML = sorteio.innerHTML + amigos[i] + ' --> ' + amigos[0] + '<br>';
    } else {
        sorteio.innerHTML = sorteio.innerHTML + amigos[i] + ' --> ' + amigos[i + 1] + '<br>';
        }
}

//código omitido
1 resposta

Tudo bom Salomão? Então sabemos que um array é um vetor de N posições e podemos pegar a quantidade de posições desse vetor (array) com o .lenght. Sabendo que um array começa sempre na posição 0 e vai até a posição lenght - 1, há um erro que foi corrigido pelos tutores logo em seguida adicionando o if (i == amigos.length - 1) dentro do if, para que assim que o for passar pela ultima posição ele irá cair dentro da condição verdadeira da expressão logica, ou seja já respondendo a parte do amigos[0], quando o for passar pela ultima posição do array, o ultimo amigo deve tirar o primeiro que está na posição [0], por isso é colocado explicitamente a posição do amigo 0. Exemplo, quando entramos com 4 nomes, A, B, C, D, temos o array abaixo,

  • Antes de Embaralhar
    0123undefined
    ABCDundefined

Lembrando que amigos.length = 4, pois temos 4 nomes. Mas o array vai somente até a posição 3 ou seja .length - 1 como podemos ver na tabela.

  • Depois de embaralhar
    0123undefined
    CADBundefined

No inicio do for o i = 0, ou seja na condicional do if fica como if (0 == 3) lembrando que estamos utilizando o código corrigido do if (i == amigos.length - 1), com isso é executado o else todas as vezes até que chegue na ultima posição da lista, abaixo listei todos os valores possiveis par ao i enquanto passa dentro do for:

sorteio.innerHTML = sorteio.innerHTML + amigos [0] + ' --> ' + amigos [0 + 1] + ''; // amigo[0+1] = amigo[1] = A

C --> A

sorteio.innerHTML = sorteio.innerHTML + amigos [1] + ' --> ' + amigos [1 + 1] + ''; // amigo [1+1] = amigo [2] = D

A --> D

sorteio.innerHTML = sorteio.innerHTML + amigos [2] + ' --> ' + amigos [2 + 1] + ''; // amigo[2+1] = amigo[3] = B

D --> B

Com isso quando o i chegar na ultima repetição do for, que é quando o i = 3 (Ultima vez que passara no for nesse exemplo), se não tivesse sido implementado o if, na parte do amigos[i + 1] iria ocorrer a seguinte problema abaixo

sorteio.innerHTML = sorteio.innerHTML + amigos [3] + ' --> ' + amigos [3 + 1] + ''; // amigo[3+1] = amigo[4] = undefined

B --> undefined

o undefined ocorre por conta de não existir a posição [4] neste array, com isso foi necessário adicionar esse if para identificar a ultima posição do array dentro do for, assim temos um tratamento diferente para a mensagem, pois quando ele estiver na ultima posição o ultimo amigo deve tirar o primeiro da lista que é o caso do amigo[0].

Somente cai dentro do if quando o for estiver na ultima posição do array ou seja irá executar a linha abaixo:

sorteio.innerHTML = sorteio.innerHTML + amigos[i] + ' --> ' + amigos[0] + '';

subistituindo o valor do i = 3 fica

sorteio.innerHTML = sorteio.innerHTML + amigos [3] + ' --> ' + amigos [0] + '';

B --> C

resolvendo assim o problema do undefined pois quando estiver na ultima posição ele pegara o amigo que está na primeira posição [0].

Espero ter ajudado :).