Optei por adotar o algoritmo de Fisher-Yates depois de ter tentado algumas opções como ''.sort()";
Também achei importante a adição do toLowerCase para evitar que, rodrigo e Rodrigo, fossem diferentes na hora de ir pro array, evitando um futuro bug na hora do sorteio.
segue meu código:
let listaDeAmigos = [];
function adicionar() {
let nomeDoAmigo = document.getElementById('nome-amigo').value.trim();
//usei o .trim() para remover possívei espaços extras no início/fim do nome.
//use o espaçamento (ensinado nas primeiras aulas) para destacar as condições que garantem um melhor funcionamento do código.
if (nomeDoAmigo === '') {
alert('Insira um nome no campo "Nome do amigo"');
return;
}
//Pesquisando, achei essa opção mais acertiva do que o ".includes" por dessa forma ignorar maiúsculas/minúsculas.
if (listaDeAmigos.some(amigo => amigo.toLowerCase() === nomeDoAmigo.toLowerCase())) {
alert('Você já adicionou esse amigo.');
document.getElementById('nome-amigo').value = '';
return;
}
listaDeAmigos.push(nomeDoAmigo);
mostrarLista();
document.getElementById('nome-amigo').value = '';
}
function mostrarLista() {
let minhaString = listaDeAmigos.join(', ');
let localDaLista = document.getElementById('lista-amigos');
localDaLista.textContent = minhaString;
console.log(minhaString);
}
function reiniciar() {
listaDeAmigos = [];
document.getElementById('lista-amigos').textContent = '';
document.getElementById('lista-sorteio').textContent = '';
document.getElementById('nome-amigo').value = '';
}
function sortear() {
if (listaDeAmigos.length < 4) {
alert('É necessário pelo menos 4 amigos para realizar o sorteio.');
return;
}
embaralha(listaDeAmigos);
let sorteados = document.getElementById('lista-sorteio');
for (let i = 0; i < listaDeAmigos.length; i++) {
if (i == listaDeAmigos.length - 1) {
sorteados.innerHTML = sorteados.innerHTML + listaDeAmigos[i] + ' → ' + listaDeAmigos[0] + '<br>';
} else {
sorteados.innerHTML = sorteados.innerHTML + listaDeAmigos[i] + ' → ' + listaDeAmigos[i + 1] + '<br>';
}
}
}
function embaralha(lista) {
for (let indice = lista.length; indice; indice--) {
const indiceAleatorio = Math.floor(Math.random() * indice);
// atribuição via destructuring
[lista[indice - 1], lista[indiceAleatorio]] =
[lista[indiceAleatorio], lista[indice - 1]];
}
}