1
resposta

Nao acho meu erro

Olá pessoal. Fiz um pouco diferente do exemplo do curso, no meu código quero que quando o ingrediente ja exista, seja feita a pergunta de novo e antes imprima um alerta de que ja existe. Esta funcionando em parte, percebi que ele só esta fazendo a comparação com o primeiro ingrediente, por exemplo, se coloco no ingrediente 1 "sal", no 2 "açucar" e no 3 "açucar", ele não mostra que deu erro, mas se eu coloco no ingrediente 1 "sal", no 2 "açucar" e no 3 "sal", mostra que ja existe e pergunta novamente, como deve ser. Agradeço se alguém puder me ajudar.

Segue meu código abaixo:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        var ingredientes = [];

        var quantidade = parseInt(prompt("Quantos ingredientes você vai adicionar?"));

        var contador = 1;

        while( contador <= quantidade) {
            var ingrediente = prompt("Informe o ingrediente " + contador);
            var tem = false;
            if(contador == 1){
                ingredientes.push(ingrediente);
                tem = true;
            }

            if(tem == false){
                for(var posicao = 0; posicao < ingredientes.length; posicao++){
                    if(ingrediente !== ingredientes[posicao]){
                        ingredientes.push(ingrediente);
                        break;
                    } else if (ingrediente == ingredientes[posicao]){
                        alert("este ingrediente ja existe");
                        contador = contador - 1;
                    }
                }
            }

            contador++;
        }

        console.log(ingredientes);
    </script>
</body>
</html>
1 resposta

Olá, Marco Antonio. Acredito que o que esteja gerando o comportamento indesejado é a lógica dessas linhas aqui:

if(ingrediente !== ingredientes[posicao]) {
        ingredientes.push(ingrediente);
        break;
}

Acontece que você já está adicionando o ingrediente à lista de ingredientes e interrompendo o looping já na primeira comparação, enquanto você deveria deixar que o ingrediente fosse comparado com todos os outros ingredientes da lista. Imagine que o seu primeiro ingrediente é arroz e o segundo é açúcar. Como terceiro ingrediente, você tenta adicionar açúcar novamente. No primeiro loop do seu for, você vai comparar açúcar com arroz. Como eles são diferentes, ele já vai adicionar açúcar novamente na lista e dar o break no looping.

Uma possível solução é que você compare não se é diferente, mas sim se é igual. Se ele rodar por todos os ingredientes e não achar nengum igual, ele deveria realmente adicionar à lista. Faz sentido?

Tenta implementar dessa forma e dá um retorno por aqui. Qualquer coisa, posso propor uma solução.

Um abraço e bons estudos.