Estoy tratando de insertar los datos del jugador (objeto) en una matriz, luego guardarlos en localStorage , pero no puedo hacerlo funcionar incluso si inicializo la matriz. En la primera ejecución obtuve los datos, pero en las siguientes ejecuciones no se reconoce la matriz. ¿Alguien sabe qué está pasando? Aquí está mi código:
function handleRanking() { console.log('run function'); let prevRanking = localStorage.getItem('ranking'); if (prevRanking === null) { console.log('null value'); prevRanking = []; } const player = { name, score: total, picture: gravatarEmail, }; if (Array.isArray(prevRanking)) { prevRanking.push(JSON.stringify(player)); localStorage.setItem('ranking', prevRanking); } else { console.log('not an array'); } }Una cosa que debe saber de inmediato es que localStorage solo puede guardar cadenas. Por lo tanto, cuando desee guardar un valor que no sea una cadena, debe llamar a JSON.stringify(data) antes de guardar y JSON.parse(data) después de obtener los datos y antes de usarlos.
En su caso, una manera fácil es agregar el player y luego guardar prevRanking como cadena. Pero antes, debe analizar lo que obtiene, ya que siempre es una string si no es null .
function handleRanking() { console.log('run function'); let prevRanking = localStorage.getItem('ranking'); if (prevRanking === null) { console.log('null value'); prevRanking = []; }else{ prevRanking = JSON.parse(prevRanking); } const player = { name, score: total, picture: gravatarEmail, }; if (Array.isArray(prevRanking)) { prevRanking.push(player); localStorage.setItem('ranking', JSON.stringify(prevRanking)); } else { console.log('not an array'); } }Una vez que haya recuperado la información del almacenamiento local, debe pasarla al método JSON.parse . Porque al almacenar información en el almacenamiento local, se guarda como una cadena.
function handleRanking() { console.log('run function'); let prevRanking = localStorage.getItem('ranking'); if (prevRanking === null) { console.log('null value'); prevRanking = []; } prevRanking = JSON.parse(prevRanking); // added it in here so prevRanking is definetly defined const player = { name, score: total, picture: gravatarEmail, }; if (Array.isArray(prevRanking)) { prevRanking.push(JSON.stringify(player)); localStorage.setItem('ranking', JSON.stringify(prevRanking)); } else { console.log('not an array'); } }Porque el valor de una clave que se obtiene de LocalStorage es una cadena. Entonces, tienes que JSON. parse antes de empujar. https://developer.mozilla.org/en-US/docs/Web/API/Storage/setItem#parameters