Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Meu codigo final comentado


const form = document.getElementById("novoItem")   
const lista = document.getElementById("lista")     

/* Tranformamos novamente o localStorage em um ARRAY usando o JSON.PARSE, assim podemos usar o forEach */
const arrayObjeto = JSON.parse(localStorage.getItem("arrayObjeto")) || [] 

/* Para cada elemento do ARRAY, criamos um item para a lista */
arrayObjeto.forEach((element) => {  
    criaItem(element)   
});

// Adicionamos um escutador de evento tipo SUBMIT, para pegar os dados, e usamos uma function para fazer algo com isso
form.addEventListener("submit", (event) =>{ 

    /* Ao carregar a pagina, não perdemos os dados inseridos. */
    event.preventDefault ()  

    /* Obtendo o valor da entrada com o nome "nome" e "quantidade" */
    const nome = event.target.elements["nome"] 
    const quantidade = event.target.elements["quantidade"]



    /* Verificamos se o nome digitado no arrayObjeto é existente */
    const verifica = arrayObjeto.find(element => element.nome === nome.value)


    /* Criamos um OBJETO com a chave e conteudo, a chave fica entre aspas "" e atribuimos ao valor digitado. */
    const objetoItem = {
        "nome" : nome.value,
        "quantidade" : quantidade.value
    }

    // VERIFICAÇÃO

    if (verifica) {
    /* Atribuindo o valor da propriedade id do objeto verificado à propriedade id do objeto ItemItem. */
        objetoItem.id = verifica.id

        console.log(verifica.id)

    /* Chamando a função atualizaItem() e passando o objeto objetoItem como parâmetro. */
        atualizaItem(objetoItem)

        /* Atualizando o arrayObjeto com o novo objeto objetoItem. */
        arrayObjeto[arrayObjeto.findIndex(element => element.id === verifica.id)] = objetoItem
    }
    else {
        /*Verificando se o arrayObjeto possui algum item. Se isso acontecer, ele adicionará 1 ao último item na matriz. Caso contrário, ele definirá o id como 0.*/
        objetoItem.id = arrayObjeto[arrayObjeto.length -1] ? (arrayObjeto[arrayObjeto.length -1]).id + 1 : 0

        /* Chamamos a function criaItens e passamos nosso objeto como parametro, mais pra frente vamos criar ela */
        criaItem (objetoItem)

        /* Adicionando o OBJETO no array. */
        arrayObjeto.push(objetoItem)
    }

    /* Colocamos nosso array dentro do localStorage, e usamos o JSON.stringy para converter o array para string */
    localStorage.setItem("arrayObjeto", JSON.stringify(arrayObjeto))


    /* Assim ao digitar um item e qtd, o input fica limpo e sem txt. */
    nome.value = ""
    quantidade.value = ""
})
function criaItem (item) {

    /* Criando um novo elemento "li" e mapeando na const itemLi e adicionamos uma classe "item"*/
    const itemLi = document.createElement("li")
    itemLi.classList.add("item")

    /* Criando um novo elemento "strong" para a quantidade */
    const itemQuantidade = document.createElement("strong")

    /* Usando o innerHTML vai receber a quantidade e salvar na variavel */
    itemQuantidade.innerHTML = item.quantidade

    /* Fazemos que o  item quantidade receba um ID */
    itemQuantidade.dataset.id = item.id

    /* Adicionamos a quantidade ao item LI */
    itemLi.appendChild(itemQuantidade)

    /* Usando o innerHTML vai receber o nome e salvar na variavel */
    itemLi.innerHTML += item.nome

    /* Depois de criar o botão, colocamos ele fomo filho da LI, adicionamos ITEM.ID como parametro */
    itemLi.appendChild(criaBotaoDeleta(item.id)) 


    /* Adicionamos os itens criado na lista UL */
    lista.appendChild(itemLi)
}
function atualizaItem (item) {


    /* fiquei um pouco confuso aqui, mas ok... */
    document.querySelector("[data-id='"+item.id+"']").innerHTML = item.quantidade
}


    /* Função que cria o botão , colocar o ID como parametro, será repassado até a function botaoDeleta () */
function criaBotaoDeleta (id) { 

    const botaoDeleta = document.createElement ("button")
    botaoDeleta.innerText = "X" 

    /* Adicionamos um escutador de evento tipo click, sempre quando o botao for clicado, ira realizar a função que vai deletar o item clicado */
    botaoDeleta.addEventListener("click", function (){

    /*this.parentNode pega o elemento que o botão pertence, passamos o ID pra frente até chegar na funcão deleta */
        deletaItem(this.parentNode, id) 
    })
    return botaoDeleta
}   
    /* Function que será responsavel por apagar os itens da lista, colocar ITEM, ID como parametro */
function deletaItem (item,id) { 

    item.remove() // apenas remove o item do HTML mas não do ARRAY e localStorage 

    /* Removendo o objeto do array que tem o id que corresponde ao id passado. */
    arrayObjeto.splice(arrayObjeto.findIndex(element => element.id === id),1)


    localStorage.setItem("arrayObjeto", JSON.stringify(arrayObjeto))
}
2 respostas
solução!

Oii Rodolpho, tudo bem com você?

Parabéns por ter concluído seu código e compartilhado com a comunidade do fórum Alura, pois assim acompanhamos seu aprendizado, além de que seu código pode auxiliar outros estudantes da plataforma!

Deixo aqui uma sugestão de melhoria para que você evolua ainda mais em seus estudos:

  • Usamos nomes intuitivos na declaração de variáveis e funções, então, seria interessante se você evitasse o comentário para funções/variáveis com nomes sugestivos tais como criaBotaoDeleta ou deletaItem. Essas são boas práticas que você vai aprimorando com o tempo.

No mais, meus parabéns pela dedicação!

Se houver alguma dúvida, me coloco à disposição.

Grande abraço e bons estudos !

Parabéns!

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software