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
0 | 1 | 2 | 3 | undefined |
---|
A | B | C | D | undefined |
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
0 | 1 | 2 | 3 | undefined |
---|
C | A | D | B | undefined |
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 :).