Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

214
Visualizações
Problem with sessionStorage: I am not displaying the first item correctly

I am having a problem with sessionStorage; in particular, I want the id of the ads to be saved in the session where the user puts the like on that particular favorite article.

However, I note that the array of objects that is returned contains the ids starting with single quotes, as shown below:

['', '1', '7']

but I want '1' to be shown to me directly.

While if I go into the sessionStorage I notice that like is shown as:

,1,7

ie with the leading comma, but I want it to start with the number directly.

How can I fix this?

function likeAnnunci(){
    let likeBtn = document.querySelectorAll('.like');
    likeBtn.forEach(btn => {
        btn.addEventListener('click', function(){
            
            let id = btn.getAttribute('ann-id');
            //sessionStorage.setItem('like', [])
            let storage = sessionStorage.getItem('like').split(',');
            //console.log(storage);
            
            if(storage.includes(id)){
                storage = storage.filter(id_a => id_a != id);
            } else {
                storage.push(id);
            }
            
            sessionStorage.setItem('like', storage)
            
            console.log(sessionStorage.getItem('like').split(','));
            btn.classList.toggle('fas');
            btn.classList.toggle('far');
            btn.classList.toggle('tx-main');
        })
    })
};

function setLike(id){
    if(sessionStorage.getItem('like')){
        let storage = sessionStorage.getItem('like').split(','); 
        
        if(storage.includes(id.toString())){
            return `fas`
        } else {
            return `far`
        }
    } else {
        sessionStorage.setItem('like', '');
        return`far`;
    }  
}

about 4 years ago · Santiago Gelvez
1 Respostas
Responde à pergunta

0

The main issue you're having is that you're splitting on a , instead of using JSON.parse().

Also, you've got some other code issues and logical errors.

Solution:

function likeAnnunci() {
    const likeBtn = document.querySelectorAll('.like');
    likeBtn.forEach((btn) => {
        btn.addEventListener('click', function () {
            let id = btn.getAttribute('ann-id');
            //sessionStorage.setItem('like', [])
            let storage = JSON.parse(sessionStorage.getItem('like') || '[]');
            //console.log(storage);

            if (!storage.includes(id)) {
                storage.push(id);
            }

            sessionStorage.setItem('like', JSON.stringify(storage));

            console.log(JSON.parse(sessionStorage.getItem('like')));
            btn.classList.toggle('fas');
            btn.classList.toggle('far');
            btn.classList.toggle('tx-main');
        });
    });
}

More modular and optimal solution:

const likeBtns = document.querySelectorAll('.like');

// If there is no previous array stored, initialize it as an empty array
const initLikesStore = () => {
    if (!sessionStorage.getItem('likes')) sessionStorage.setItem('likes', JSON.stringify([]));
};

// Get the item from sessionStorage and parse it into an array
const grabLikesStore = () => JSON.parse(sessionStorage.getItem('likes'));

// Set a new value for the likesStore, automatically serializing the value into a string
const setLikesStore = (array) => sessionStorage.setItem('likes', JSON.stringify(array));

// Pass in a value.
const addToLikesStore = (value) => {
    // Grab the current likes state
    const pulled = grabStorage();

    // If the value is already there, do nothing
    if (pulled.includes(value)) return;

    // Otherwise, add the value and set the new array
    // of the likesStore
    storage.push(value);
    setLikesStore(pulled);
};

const likeAnnunci = (e) => {
    // Grab the ID from the button clicked
    const id = e.target.getAttribute('ann-id');

    // Pass the ID to be handled by the logic in the
    // function above.
    addToLikesStore(id);

    console.log(grabLikesStore());

    btn.classList.toggle('fas');
    btn.classList.toggle('far');
    btn.classList.toggle('tx-main');
};

// When the dom content loads, initialize the likesStore and
// add all the button event listeners
window.addEventListener('DOMContentLoaded', () => {
    initLikesStore();
    likeBtns.forEach((btn) => btn.addEventListener('click', likeAnnunci));
});
about 4 years ago · Santiago Gelvez Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda