Ottieni le chiavi HTML5 localStorage


145

Mi sto solo chiedendo come ottenere tutti i valori chiave localStorage.


Ho provato a recuperare i valori con un semplice ciclo JavaScript

for (var i=1; i <= localStorage.length; i++)  {
   alert(localStorage.getItem(i))
}

Funziona solo se i tasti sono numeri progressivi, a partire da 1.


Come ottengo tutte le chiavi per visualizzare tutti i dati disponibili?




Perché questo ciclo inizia con i = 1 e termina con i = localStorage.length? Nei browser che ho testato (Chrome), il ciclo dovrebbe iniziare a 0 e terminare in localStorage.length - 1 ...
Louis LC,

@LouisLC perché stavo usando numeri progressivi per le mie chiavi (come una chiave primaria in un database relazionale).
Simone,

Risposte:


35

in ES2017 puoi usare:

Object.entries(localStorage)

5
e presumo Object.keys()funzioni anche come previsto?

292
for (var key in localStorage){
   console.log(key)
}

EDIT: questa risposta sta ricevendo molti voti, quindi immagino sia una domanda comune. Sento di doverlo a chiunque possa inciampare nella mia risposta e pensare che sia "giusto" solo perché è stato accettato di fare un aggiornamento. La verità è che l'esempio sopra non è proprio il modo giusto per farlo. Il modo migliore e più sicuro è farlo in questo modo:

for ( var i = 0, len = localStorage.length; i < len; ++i ) {
  console.log( localStorage.getItem( localStorage.key( i ) ) );
}

In questo link .... stackoverflow.com/questions/15313606/… ... perché stanno usando tutti questi strani metodi per accedere a localStorage?

2
Diverse domande per il codice "migliore / più sicuro": 1) Perché dichiararlo localStorage.lengthe non utilizzarlo direttamente? 2) Perché dichiararlo all'interno del ciclo for? 3) Perché ++iè preferito rispetto i++?
Luciano Bargmann,

8
L'hai provato davvero? ++isicuramente non inizia il ciclo alle i = 1. La terza espressione all'interno della parentesi viene valutata dopo ogni iterazione. i++ed ++ientrambi hanno lo stesso effetto su i. La differenza è che ++ivaluta il nuovo valore di idopo l'incremento, mentre i++valuta il valore di i prima dell'incremento. Qui non fa assolutamente alcuna differenza, perché tutto ciò che ci interessa è l'effetto collaterale dell'incremento i, non il valore dell'espressione.
Kevin Ennis,

33
Vale la pena notare che al giorno d'oggi Object.keys(localStorage)funziona perfettamente per questo scenario, purché non sia necessario supportare IE <9.
Adrian

2
È anche utile notare che se si desidera visualizzare il nome della chiave stessa, è possibile farlo con la localStorage.key( i )parte.
Sean Colombo,

30

Mi piace creare un oggetto facilmente visibile da questo in questo modo.

Object.keys(localStorage).reduce(function(obj, str) { 
    obj[str] = localStorage.getItem(str); 
    return obj
}, {});

Faccio una cosa simile anche con i cookie.

document.cookie.split(';').reduce(function(obj, str){ 
    var s = str.split('='); 
    obj[s[0].trim()] = s[1];
    return obj;
}, {});

1
Mi piace quello stile di iterare sugli oggetti.
Jonathan Stellwag,

12
function listAllItems(){  
    for (i=0; i<=localStorage.length-1; i++)  
    {  
        key = localStorage.key(i);  
        alert(localStorage.getItem(key));
    }  
}

9

È possibile utilizzare la localStorage.key(index)funzione per restituire la rappresentazione in formato stringa, dove si indextrova l'ennesimo oggetto che si desidera recuperare.


7

Se il browser supporta HTML5 LocalStorage, dovrebbe anche implementare Array.prototype.map, abilitando questo:

Array.apply(0, new Array(localStorage.length)).map(function (o, i) {
    return localStorage.key(i);
})

Puoi anche fare ciò new Array(this.localStorage.length).fill(0)che sembra un po 'meno confuso rispetto all'utilizzo di applicare imo.
Lenny

6

Dal momento che la domanda menzionata trovava le chiavi, ho pensato di menzionare che per mostrare ogni chiave e coppia di valori, potresti farlo in questo modo (basato sulla risposta di Kevin):

for ( var i = 0, len = localStorage.length; i < len; ++i ) {
  console.log( localStorage.key( i ) + ": " + localStorage.getItem( localStorage.key( i ) ) );
}

Ciò registrerà i dati nel formato "chiave: valore"

(Kevin: sentiti libero di inserire queste informazioni nella tua risposta se vuoi!)


1

Questo stamperà tutte le chiavi e i valori su localStorage:

ES6:

for (let i=0; i< localStorage.length; i++) {
    let key = localStorage.key(i);
    let value = localStorage[key];
    console.log(`localStorage ${key}:  ${value}`);
}

1

Puoi ottenere chiavi e valori come questo:

for (let [key, value] of Object.entries(localStorage)) {
  console.log(`${key}: ${value}`);
}

0

Sono d'accordo con Kevin che ha la risposta migliore ma a volte quando hai chiavi diverse nella tua memoria locale con gli stessi valori, ad esempio, vuoi che i tuoi utenti pubblici vedano quante volte hanno aggiunto i loro articoli nei loro cesti, devi mostrare loro il anche quante volte puoi usare questo:

var set = localStorage.setItem('key', 'value');
var element = document.getElementById('tagId');

for ( var i = 0, len = localStorage.length; i < len; ++i ) {
  element.innerHTML =  localStorage.getItem(localStorage.key(i)) + localStorage.key(i).length;
}

-1

Per quelli che menzionano l'uso di Object.keys(localStorage)... non perché non funzionerà in Firefox (ironicamente perché Firefox è fedele alle specifiche). Considera questo:

localStorage.setItem("key", "value1")
localStorage.setItem("key2", "value2")
localStorage.setItem("getItem", "value3")
localStorage.setItem("setItem", "value4")

Perché key, getItem e setItem sono Object.keys(localStorage)solo metodi prototipali ["key2"].

È meglio fare qualcosa del genere:

let t = [];
for (let i = 0; i < localStorage.length; i++) {
  t.push(localStorage.key(i));
}

@Darkrum Poiché Firefox segue correttamente le specifiche, key, getItem e setItem mancherebbero se usi object.keys()... Aggiornerò la mia risposta per riflettere questo.
Mike Ratcliffe,

Basta leggere le specifiche per l'archiviazione locale e non vedo quello che hai menzionato.
Darkrum,

E leggi le specifiche di object.keys () sembra che Firefox sia ciò che non lo fa se ciò che dici è vero.
Darkrum,

@Darkrum Guarda html.spec.whatwg.org/multipage/… e puoi vedere che la specifica definisce l'IDL con [Exposed=Window]. Ciò comporta il comportamento che descrivo. Se fosse stato specificato con [Exposed=Window,OverrideBuiltins]esso avrebbe dato il comportamento che ci aspettiamo ma la specifica non specifica OverrideBuiltins. Puoi vedere una discussione al riguardo in whatwg / html qui: github.com/whatwg/html/issues/183
Mike Ratcliffe,

Ancora una volta, come dirò, questo non ha nulla a che fare con il funzionamento di object.keys. La scelta di Mozillas di non consentire che vengano impostati è il modo in cui interpretano le specifiche. Chiaramente Google sapeva cosa stava facendo perché cosa fa un prototipo che non può essere modificato se non fatto in modo specifico con altri mezzi ha qualcosa a che fare con le proprie proprietà.
Darkrum,

-3

Possiamo anche leggere per nome.

Supponiamo di aver salvato il valore con il nome "utente" in questo modo

localStorage.setItem('user', user_Detail);

Quindi possiamo leggerlo usando

localStorage.getItem('user');

L'ho usato e funziona senza problemi, non è necessario eseguire il ciclo for

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.