Tengo una clave de almacenamiento local (f7Contacts) almacenada como una matriz JSON, como debería ser. Sé cómo eliminar la clave completa usando localStorage.removeItem("myKey"); .
Mi matriz, como puede ver, está formada por un conjunto de matrices JSON incrustadas en su interior. Existe el más amplio llamado f7Contacts y dentro de él hay algunos subarreglos (por nombrarlos de alguna manera) llamadosvisitings y consultas . Ahora, lo que estoy tratando de eliminar no es un solo elemento de ninguna de las matrices JSON ni toda la matriz f7Contacts , sino la submatriz JSON llamada consultas .
Lo he intentado de muchas maneras, pero no pude obtener un código que funcione.
Esto es lo que tengo hasta ahora:
Mi matriz stringify se ve así:
(ahora he actualizado la cadena para que se parezca más a mi caso real porque las respuestas propuestas logran borrar las consultas solo en uno de los contactos, y en un caso borra las consultas del primer contacto y borra el resto de los contactos. Nombré a ELISA y FRANK para que los diferencies. También actualicé mi Javascript y html como una mezcla de mi propio código y el de la respuesta de ЖнецЪ. Hice esto para mantener mi entorno consistente. Este código logró eliminar las consultas de el primer contacto pero también elimina el resto de los contactos ):
JAVASCRIPT
document.addEventListener("DOMContentLoaded", function() { var contacts = [{ id: "95470e9e-ee5c-4467-9500-1fcbeae1b57c", hasPic: true, picId: 3, createdOn: "2021-08-01T17:31:32.230Z", firstName: "ELISA", company: "La Fábrica", job: "Barrendero", mobile: "+53555555", phone: "+5372222222", sms: "", email: "fulano@nauta.cu", madedate: "Invalid date", clinic: "2", gender: "M", birthday: "Invalid date", age: "47", visitings: [{ id: "1", vdate: "19/07/-2006 12:00 AM", pdcb: "Est officia dolorem ", vdiagnose: "Laborum Ea consecte", vrecom: "Mollit cillum sed pe", nextv: "Invalid date" }], consultas: [{ id: "1", ldate: "04/07/-1978 12:00 AM", lmotive: "Soluta cumque aspern", ldiagnose: "Quidem autem do ut o", ttest: "Rerum sint atque il", etest: "Officiis deserunt un", mtest: "Nihil a dolore rem s", nextv: "Invalid date" }, { id: "2", ldate: "04/04/-1991 12:00 AM", lmotive: "Eius in est enim no", ldiagnose: "In aliqua Sunt dol", ttest: "Sunt dolor eu sed N", etest: "Quia aut reprehender", mtest: "Unde libero autem an", nextv: "Invalid date" } ], isFavorite: true }, {id: "95470e9e-ee5c-4467-9500-1fcbeae1b57c", hasPic: true, picId: 3, createdOn: "2021-08-01T17:31:32.230Z", firstName: "FRANK", company: "La Fábrica", job: "Barrendero", mobile: "+53555555", phone: "+5372222222", sms: "", email: "fulano@nauta.cu", madedate: "Invalid date", clinic: "2", gender: "M", birthday: "Invalid date", age: "47", visitings: [{ id: "1", vdate: "19/07/-2006 12:00 AM", pdcb: "Est officia dolorem ", vdiagnose: "Laborum Ea consecte", vrecom: "Mollit cillum sed pe", nextv: "Invalid date" }], consultas: [{ id: "1", ldate: "04/07/-1978 12:00 AM", lmotive: "Soluta cumque aspern", ldiagnose: "Quidem autem do ut o", ttest: "Rerum sint atque il", etest: "Officiis deserunt un", mtest: "Nihil a dolore rem s", nextv: "Invalid date" }, { id: "2", ldate: "04/04/-1991 12:00 AM", lmotive: "Eius in est enim no", ldiagnose: "In aliqua Sunt dol", ttest: "Sunt dolor eu sed N", etest: "Quia aut reprehender", mtest: "Unde libero autem an", nextv: "Invalid date" } ], isFavorite: true }]; // Get from lS const lS = JSON.parse(localStorage.getItem('f7Contacts')); // DOM elements const cancelBtn = document.getElementById('dntdelete'); const deleteBtn = document.getElementById('delete'); const consultas = document.getElementById('consultas'); const json = document.getElementById('json'); function clearConsults(){ document.getElementById('confirm').style.display="block"; { function removeItem() { const lS = JSON.parse(localStorage.getItem('f7Contacts')); if (!lS) return; const obj = lS[0]; // Find 'consultas' key in the object const findKey = Object.keys(obj).find(key => key.includes('consultas')); if (findKey) { // Delete key from the object with array delete obj[findKey]; } // Back wraping the obj into array & put to the localStorage localStorage.setItem('f7Contacts', JSON.stringify([obj])); //set item back into storage } alert('CONSULTAS ELIMINADAS'); document.getElementById('confirm').style.display="none"; if (lS[0].consultas) { consultas.textContent = lS[0].consultas.length; } consultas.textContent = 0; json.textContent = JSON.stringify(obj, undefined, 2); } cancelBtn.addEventListener('click', dntdelete); deleteBtn.addEventListener('click', clearConsults); } }); document.getElementById('dntdelete').onclick = function(){ alert('OPERACIÓN CANCELADA'); document.getElementById('confirm').style.display="none"; return false; };HTML
<main> <div class="results"> <h4>Consultas<span id="consultas"></span></h4> </div> <div class="control-buttons"> <div id="confirm" style="display: none"> <button id="delete">Delete</button> <button id="dntdelete">Cancel</button> </div> <a onclick="clearConsults()">Delete Consultas</a><h3>SURE YOU WANT TO DELETE?</h3> </div> </main> Debo dejar claro que esta clave localStorage (f7Contacts) está realmente almacenada por otro js dentro de la aplicación y si he incluido localStorage.setItem("f7Contacts", JSON.stringify(contacts)); al comienzo de mi código anterior es solo un intento de dejarlo claro. Y deje en claro también que hay varios contactos dentro de la cadena y la tarea es eliminar las consultas para todos ellos.
No hay una API para realizar esa operación como se documenta aquí en MDN.
Pero puedes hacerlo tú mismo con algo como:
// Original state const state = { id: 100, name: 'Karen', test: true <--- initial creation of key we'll delete } // Save state localStorage.setItem('state', JSON.stringify(state)) console.log(state) // Example of removing a single key from an object within localStorage const modifiedState = JSON.parse(localStorage.getItem('state')) // Delete the `test` key delete modifiedState.test // Update storage localStorage.setItem('state', JSON.stringify(modifiedState)) // Show the updated state directly from localStorage console.log(JSON.parse(localStorage.getItem('state')))cuando lee un elemento en particular de localStorage , devuelve una cadena, y no hay forma de eliminar algún elemento en particular de los datos guardados, pero puede convertir los datos guardados en un Objeto
y luego use el operador de delete para eliminar cualquier cosa de ese objeto
// This is Sample Data for demonstration purposes // And from this sample data i want to remove this Gender item const data = { name: "Andrew", email: "example@example.com", gender: "male" } // Here you set your Data by Converting it into a String using JSON.stringify() localStorage.setItem('data', JSON.stringify(data)) console.log(localStorage.getItem('data')) // Prints out {"name":"Andrew","email":"example@example.com","gender":"male"} let storedData = localStorage.getItem('data') // Get Data from localStorage let newData = JSON.parse(storedData) // Convert it back into a object using JSON.parse() delete newData.gender // Then remove a item using delete operator localStorage.setItem('data', JSON.stringify(newData)) // Saving to LocalStorafe console.log(JSON.parse(localStorage.getItem('data'))) // Prints Out {name: "Andrew", email: "example@example.com"} Lea más sobre el operador de Delete en la documentación de MDN
Edite para eliminar el elemento que desea probar esto:
var contacts = { f7Contacts: [{ "id": "95470e9e-ee5c-4467-9500-1fcbeae1b57c", "hasPic": true, "picId": 3, "createdOn": "2021-08-01T17:31:32.230Z", "firstName": "Fulano Menganejo Ciclanejo", "company": "La Fábrica", "job": "Barrendero", "mobile": "+53555555", "phone": "+5372222222", "sms": "", "email": "fulano@nauta.cu", "madedate": "Invalid date", "clinic": "2", "gender": "M", "birthday": "Invalid date", "age": "47", "visitings": [{ "id": "1", "vdate": "19/07/-2006 12:00 AM", "pdcb": "Est officia dolorem ", "vdiagnose": "Laborum Ea consecte", "vrecom": "Mollit cillum sed pe", "nextv": "Invalid date" }], "consultas": [{ "id": "1", "ldate": "04/07/-1978 12:00 AM", "lmotive": "Soluta cumque aspern", "ldiagnose": "Quidem autem do ut o", "ttest": "Rerum sint atque il", "etest": "Officiis deserunt un", "mtest": "Nihil a dolore rem s", "nextv": "Invalid date" }, {"id": "2", "ldate": "04/04/-1991 12:00 AM", "lmotive": "Eius in est enim no", "ldiagnose": "In aliqua Sunt dol", "ttest": "Sunt dolor eu sed N", "etest": "Quia aut reprehender", "mtest": "Unde libero autem an", "nextv": "Invalid date" }], "isFavorite":true }] }; console.log(contacts.f7Contacts[0].hasOwnProperty("consultas")); // Prints true delete contacts.f7Contacts[0].consultas console.log(contacts.f7Contacts[0].hasOwnProperty("consultas")); // Prints False Así que ya te dije lo que hace el operador de delete , ¡ahora con solo usar eliminar puedes ver cómo puedes eliminar un elemento!
Explicación: Bueno Object.hasOwnProperty(property) simple devuelve true si ese objeto dado tiene una propiedad, en nuestro ejemplo es consultas y devuelve false si ese objeto no tiene una propiedad como esa.
Lea acerca Object.hasOwnProperty(property) en MDN Docs
Actualizaciones: función de eliminación de llamadas al hacer clic en el botón y eliminar todas las consultas de F7Contacts.
var contacts = [{ "id": "95470e9e-ee5c-4467-9500-1fcbeae1b57c", "hasPic": true, "picId": 3, "createdOn": "2021-08-01T17:31:32.230Z", "firstName": "Fulano Menganejo Ciclanejo", "company": "La Fábrica", "job": "Barrendero", "mobile": "+53555555", "phone": "+5372222222", "sms": "", "email": "fulano@nauta.cu", "madedate": "Invalid date", "clinic": "2", "gender": "M", "birthday": "Invalid date", "age": "47", "visitings": [{ "id": "1", "vdate": "19/07/-2006 12:00 AM", "pdcb": "Est officia dolorem ", "vdiagnose": "Laborum Ea consecte", "vrecom": "Mollit cillum sed pe", "nextv": "Invalid date" }], "consultas": [{ "id": "1", "ldate": "04/07/-1978 12:00 AM", "lmotive": "Soluta cumque aspern", "ldiagnose": "Quidem autem do ut o", "ttest": "Rerum sint atque il", "etest": "Officiis deserunt un", "mtest": "Nihil a dolore rem s", "nextv": "Invalid date" }, {"id": "2", "ldate": "04/04/-1991 12:00 AM", "lmotive": "Eius in est enim no", "ldiagnose": "In aliqua Sunt dol", "ttest": "Sunt dolor eu sed N", "etest": "Quia aut reprehender", "mtest": "Unde libero autem an", "nextv": "Invalid date" }], "isFavorite":true }] localStorage.setItem("f7Contacts", JSON.stringify(contacts));Eliminar todas las consultas de F7Contacts:
function removeItem() { var contacts = JSON.parse(localStorage.getItem("f7Contacts")) || {}; //fetch f7Contacts from storage for (var k = 0; k < contacts.length; k++) { delete contacts[k].consultas; } localStorage.setItem("f7Contacts", JSON.stringify(contacts)); }Función de eliminación de llamadas al hacer clic en el botón:
function clearConsults(){ console.log((localStorage.f7Contacts)); removeItem(); console.log((localStorage.f7Contacts)); }Si no me equivoco, entiendo que desea eliminar solo las consultas del localStorage . Creo que es mejor encontrar la clave del objeto con Object.keys y luego eliminar esa clave del objeto. ejemplo de trabajo
guión.js
document.addEventListener('DOMContentLoaded', function () { var contacts = [ { id: '95470e9e-ee5c-4467-9500-1fcbeae1b57c', hasPic: true, picId: 3, createdOn: '2021-08-01T17:31:32.230Z', firstName: 'ELISA', company: 'La Fábrica', job: 'Barrendero', mobile: '+53555555', phone: '+5372222222', sms: '', email: 'fulano@nauta.cu', madedate: 'Invalid date', clinic: '2', gender: 'M', birthday: 'Invalid date', age: '47', visitings: [ { id: '1', vdate: '19/07/-2006 12:00 AM', pdcb: 'Est officia dolorem ', vdiagnose: 'Laborum Ea consecte', vrecom: 'Mollit cillum sed pe', nextv: 'Invalid date', }, ], consultas: [ { id: '1', ldate: '04/07/-1978 12:00 AM', lmotive: 'Soluta cumque aspern', ldiagnose: 'Quidem autem do ut o', ttest: 'Rerum sint atque il', etest: 'Officiis deserunt un', mtest: 'Nihil a dolore rem s', nextv: 'Invalid date', }, { id: '2', ldate: '04/04/-1991 12:00 AM', lmotive: 'Eius in est enim no', ldiagnose: 'In aliqua Sunt dol', ttest: 'Sunt dolor eu sed N', etest: 'Quia aut reprehender', mtest: 'Unde libero autem an', nextv: 'Invalid date', }, ], isFavorite: true, }, { id: '95470e9e-ee5c-4467-9500-1fcbeae1b57c', hasPic: true, picId: 3, createdOn: '2021-08-01T17:31:32.230Z', firstName: 'FRANK', company: 'La Fábrica', job: 'Barrendero', mobile: '+53555555', phone: '+5372222222', sms: '', email: 'fulano@nauta.cu', madedate: 'Invalid date', clinic: '2', gender: 'M', birthday: 'Invalid date', age: '47', visitings: [ { id: '1', vdate: '19/07/-2006 12:00 AM', pdcb: 'Est officia dolorem ', vdiagnose: 'Laborum Ea consecte', vrecom: 'Mollit cillum sed pe', nextv: 'Invalid date', }, ], consultas: [ { id: '1', ldate: '04/07/-1978 12:00 AM', lmotive: 'Soluta cumque aspern', ldiagnose: 'Quidem autem do ut o', ttest: 'Rerum sint atque il', etest: 'Officiis deserunt un', mtest: 'Nihil a dolore rem s', nextv: 'Invalid date', }, { id: '2', ldate: '04/04/-1991 12:00 AM', lmotive: 'Eius in est enim no', ldiagnose: 'In aliqua Sunt dol', ttest: 'Sunt dolor eu sed N', etest: 'Quia aut reprehender', mtest: 'Unde libero autem an', nextv: 'Invalid date', }, ], isFavorite: true, }, ]; // Get from lS const lS = JSON.parse(localStorage.getItem('f7Contacts')); // DOM elements const clearConsultsBtn = document.getElementById('clear-consults'); const confirmBtn = document.getElementById('confirm'); const createBtn = document.getElementById('create'); const cancelBtn = document.getElementById('dntdelete'); const deleteBtn = document.getElementById('delete'); const consultas = document.getElementById('consultas'); const controlBtns = document.querySelector('.control-buttons'); const json = document.getElementById('json'); // Check if not lS if (!lS) { localStorage.setItem('f7Contacts', JSON.stringify(contacts)); /// JUST FOR VISIBILITY let num = 0; for (const i of contacts) { num += i.consultas.length; consultas.textContent = num; } json.textContent = JSON.stringify(contacts, undefined, 2); } if (lS) { for (const i of lS) { if (!i.consultas) consultas.textContent = 0; } json.textContent = JSON.stringify(lS, undefined, 2); } function removeItem() { const lS = JSON.parse(localStorage.getItem('f7Contacts')); if (!lS) return; // Creating new array without 'consultas' const clearArray = lS.map(obj => { // Find 'consultas' key in the object const findKey = Object.keys(obj).find(key => key.includes('consultas')); if (findKey) { // Delete key from the object with array delete obj[findKey]; } return obj; // Returning object to array without 'consultas' }); // Put to the localStorage localStorage.setItem('f7Contacts', JSON.stringify(clearArray)); //set item back into storage alert('CONSULTAS ELIMINADAS'); controlBtns.style.display = 'none'; clearConsultsBtn.style.display = 'block'; /// JUST FOR VISIBILITY if (clearArray) { for (const i of clearArray) { if (!i.consultas) consultas.textContent = 0; } } json.textContent = JSON.stringify(clearArray, undefined, 2); } function addItem() { localStorage.setItem('f7Contacts', JSON.stringify(contacts)); /// JUST FOR VISIBILITY let num = 0; for (const i of contacts) { num += i.consultas.length; consultas.textContent = num; } json.textContent = JSON.stringify(contacts, undefined, 2); } function clearConsults() { alert('OPERACIÓN CANCELADA'); controlBtns.style.display = 'flex'; clearConsultsBtn.style.display = 'none'; } function cancel() { alert('OPERACIÓN CANCELADA'); controlBtns.style.display = 'none'; clearConsultsBtn.style.display = 'block'; } clearConsultsBtn.addEventListener('click', clearConsults); createBtn.addEventListener('click', addItem); cancelBtn.addEventListener('click', cancel); deleteBtn.addEventListener('click', removeItem); confirmBtn.addEventListener('click', clearConsults); });índice.html
<main> <div class="results"> <h4>Consultas arrays<span id="consultas"></span></h4> </div> <h3>SURE YOU WANT TO DELETE?</h3> <button id="clear-consults">Delete Consultas</button> <div class="control-buttons"> <button id="dntdelete">Cancel</button> <button id="delete">Delete</button> <button id="create">Create</button> </div> <div id="confirm"></div> <pre id="json"></pre> </main>estilo.css
* { margin: 0; padding: 0; box-sizing: border-box; font-family: serif; } body, html { padding: 20px; } main { min-width: 100%; display: grid; grid-template-rows: repeat(4, max-content); gap: 10px; justify-content: center; color: #4c5f6b; } .control-buttons { display: none; gap: 20px; } button { padding: 8px 15px; border: none; color: #4c5f6b; border-radius: 3px; cursor: pointer; } #cancel { background-color: #4c5f6b; } #delete { background-color: #89608e; color: whitesmoke; } #create { background-color: #6eaa8d; color: whitesmoke; } .results { display: flex; gap: 20px; } .results h4 { text-transform: lowercase; } .results span { width: 50px; margin-left: 5px; padding: 3px 9px; border: 2px solid #6eaa8d; } #confirm { display: none; } pre { font-size: 10px; }Paso 1: Obtenga sus datos de almacenamiento y analícelos en un objeto:
let f7ContactsArray = JSON.parse(localStorage.getItem('f7Contacts'))Paso 2: haga un bucle en su objeto JavaScript analizado para eliminar la matriz de consulatas:
if(Array.isArray(f7ContactsArray)){ f7ContactsArray = f7ContactsArray.map(contact => { delete contact.consultas; //use object delete to remove the property return contact; }) }Paso 3: reemplace la clave localStorage con una matriz de contactos actualizada:
localStorage.setItem('f7Contacts', JSON.stringify(f7ContactsArray))Usando un método simplemente haz algo como:
const clearConsults = () => { let f7ContactsArray = JSON.parse(localStorage.getItem('f7Contacts')); if(Array.isArray(f7ContactsArray)){ f7ContactsArray = f7ContactsArray.map(contact => { delete contact.consultas; //use object delete to remove the property return contact; }); localStorage.setItem('f7Contacts', JSON.stringify(f7ContactsArray)) } } <main> <div class="results"> <h4>Consultas<span id="consultas"></span></h4> </div> <div class="control-buttons"> <div id="confirm" style="display: none"> <button id="delete">Delete</button> <button id="dntdelete">Cancel</button> </div> <a onclick="clearConsults()">Delete Consultas</a><h3>SURE YOU WANT TO DELETE?</h3> </div> </main>NOTA: Asegúrese de que su archivo o método JavaScript esté incluido a través de la etiqueta de secuencia de comandos en su HTML