Mi problema es que tengo un objeto inicial con datos en la función. La función recibe parámetros con valores que están en este objeto inicial . Necesito actualizar el objeto inicial cada vez con los datos, que provienen de params .
El código:
export function saveLocalStorage(params = {}) { let state = { firstName: '', lastName: '', role: '', idToken: '', auth: false, id: '', email: '', phone: '', organizationId: '', lastVisit: '', } localStorage.setItem('donisi-new', JSON.stringify(state)) }los parámetros tienen los mismos nombres que los nombres en el objeto inicial , ejemplo:
saveLocalStorage({ firstName, lastName, role, organizationId, auth: true, idToken, lastVisit: moment(new Date()), })Entonces, por ejemplo, la primera vez que recibí el primer objeto con parámetros, por ejemplo:
saveLocalStorage({ firstName: 'La La', lastName: 'Bla Bla' })y la segunda vez que recibí un objeto con parámetros:
saveLocalStorage({ role: 'admin', phone: '+111111111' })¿Cómo actualizar el estado inicial y no eliminar los valores y solo actualizarlos ?
Gracias a todos.
Esta es una función que uso para fusionar 2 objetos de JavaScript:
function mergeObjects(obj, src) { for (var key in src) { if (src.hasOwnProperty(key)) obj[key] = src[key]; } return obj; }Así que si tuvieras estos 2 objetos:
var obj1 = {name: 'Bob', age: 30}; var obj2 = {name: 'Steve'};Y ejecutó la función:
mergeObjects(obj1, obj2);Volvería:
{name: 'Steve', age: 30}Para lograr este comportamiento, puede utilizar el operador de expansión (...) de ES6 para fusionar objetos. Combinará los dos objetos. Los nuevos campos se agregarán desde ambos objetos y los existentes se actualizarán.
Simplemente reemplace su
localStorage.setItem('donisi-new', JSON.stringify(state))con
localStorage.setItem('donisi-new', JSON.stringify({...state, ...params}))El orden de estado y parámetros es importante aquí. Este pedido significa que el objeto de estado se actualizará con nuevos valores que existen en el objeto de parámetros.
Parte del problema con la actualización del estado inicial es que tiene el state definido en la función, por lo que esos valores no se pueden actualizar. Una forma de abordar esto es extraer el state en su propio archivo y luego hacer referencia a él en su función.
// state.js export default { firstName: '', lastName: '', role: '', idToken: '', auth: false, id: '', email: '', phone: '', organizationId: '', lastVisit: '', }; Luego, en su función, puede hacer referencia a ella y actualizarla según sea necesario. La próxima vez que llame a saveLocalStorage , el estado se habrá actualizado desde la llamada anterior.
import * as state from "./state.js"; export function saveLocalStorage(params = {}) { /* Update state with values from params example for (const [key, value] of Object.entries(params)) { state[key] = value; } */ localStorage.setItem('donisi-new', JSON.stringify(state)) }Dejo parte de esto en un comentario porque quizás tengas algo más en mente para actualizar el estado o antes de fusionarte.