Array.pop() not working

Asked

Viewed 54 times

-2

I am doing a programming exercise, my goal is to create a guest registration system based on arrays. At this time I am trying to implement a filter system to bar the registration according to a minimum age, I tried to do with the Array.filter but I couldn’t, because I want an alert message to appear and I couldn’t implement it in filter. I decided to try to do with the pop() and if(), in parts worked, the warning appears correctly, but the pop() does not erase the record made. Does anyone have any idea what they might do? I’ll leave the code below.

var convidados = [] 
        var idadeMinima = 18
        var barrados = []

       function cadastrar() {      
            var nome = document.getElementById('nome').value

            convidados[nome] = {nome:document.getElementById('nome').value , idade:Number(document.getElementById('idade').value) , genero:document.getElementById('genero').value , rg:document.getElementById('rg').value , cpf:document.getElementById('cpf').value}  

            filtrarIdade()
        }

        function filtrarIdade(){
            var nome = document.getElementById('nome').value

            if(convidados[nome].idade>idadeMinima){
                document.getElementById('alerta').innerHTML = 'O convidado foi cadastrado com sucesso!'
            } else{
                var barrados = convidados.pop()
                document.getElementById('alerta').innerHTML = `A idade mínima do evento é ${idadeMinima}!`
            }
        }
  • 2

    It would not be easier to validate before entering the record?

  • It would, but I hadn’t thought of it, when I did it solved.

  • If your problem is solved put as an answer what you did to solve and choose as the right answer to close the question.

  • I’ll do it, thanks, I’m new at stackoverflow, I’m learning about the practices.

2 answers

4


In Javascript, we do not work with arrays using named keys, when we try to do so, our array will be treated as an Object.

Therefore, when you perform:

convidados[nome] = { ... }

You’re not adding any items to your array, you can check this by adding a console.log just below:

console.log(convidados)

For your implementation to work properly, try changing your code to the following:

var convidados = [] 
var idadeMinima = 18
var barrados = []

function cadastrar() {
    const convidado = {nome:document.getElementById('nome').value , idade:Number(document.getElementById('idade').value) , genero:document.getElementById('genero').value , rg:document.getElementById('rg').value , cpf:document.getElementById('cpf').value}

    convidados.push(convidado) 

    filtrarIdade()
}

function filtrarIdade(){
    var nome = document.getElementById('nome').value

    const convidadoSelecionado = convidados.find(convidado => convidado.nome == nome)

    if(convidadoSelecionado.idade>idadeMinima){
        document.getElementById('alerta').innerHTML = 'O convidado foi cadastrado com sucesso!'
    } else{
        barrados.push(convidados.pop())
        document.getElementById('alerta').innerHTML = `A idade mínima do evento é ${idadeMinima}!`
    }
}

Observing

It is good practice to filter the guest before adding them to the Guest Array

  • I followed your observation and put the filter before registering, it was easier and clean the code, now everything works correctly. I am beginner in programming, thank you very much!

0

I was able to solve the problem using the array.push() in place of array[nome] = {...}. To put the filter I changed the order of the commands, so as soon as the registration Function is activated the age filter enters the scene before the registration itself and serves as a redirector, those who are barred enter a unique array just as guests enter the guest array. Thank you all so much for your help.

function cadastrar() {      
            var nome = document.getElementById('nome').value

            const convidado = {nome:nome , idade:Number(document.getElementById('idade').value) , genero:document.getElementById('genero').value , rg:document.getElementById('rg').value , cpf:document.getElementById('cpf').value}  

            filtrarIdade(convidado)                  
        }

        function filtrarIdade(convidado){
            var nome = document.getElementById('nome').value

            if(convidado.idade>= idadeMinima){
                convidados.push(convidado)
                document.getElementById('alerta').classList.remove('alerta')
                document.getElementById('alerta').innerHTML = 'O convidado foi cadastrado com sucesso!'
                listarCadastros()
            } else{
                barrados.push(convidado)
                document.getElementById('alerta').classList.add('alerta')
                document.getElementById('alerta').innerHTML = `A idade mínima do evento é ${idadeMinima}!`
                listarBarrados() 
            }
        }

Observing
I added the classList.add() to change the color of the alert when it is negative.

Browser other questions tagged

You are not signed in. Login or sign up in order to post.