Looping attraverso localStorage in HTML5 e JavaScript


92

Quindi, stavo pensando di poter eseguire il loop attraverso localStorage come un oggetto normale poiché ha una lunghezza. Come posso eseguire il loop attraverso questo?

localStorage.setItem(1,'Lorem');
localStorage.setItem(2,'Ipsum');
localStorage.setItem(3,'Dolor');

Se lo faccio localStorage.lengthrestituisce 3che è corretto. Quindi presumo che un for...inciclo funzionerebbe.

Stavo pensando qualcosa del tipo:

for (x in localStorage){
    console.log(localStorage[x]);
}

Ma nessun risultato. Qualche idea?

L'altra idea che avevo era qualcosa di simile

localStorage.setItem(1,'Lorem|Ipsum|Dolor')
var split_list = localStorage.getItem(1).split('|');

In cui for...infunziona.


Risposte:


143

Puoi usare il keymetodo. localStorage.key(index)restituisce la indexchiave esima (l'ordine è definito dall'implementazione ma costante finché non si aggiungono o rimuovono le chiavi)

for (var i = 0; i < localStorage.length; i++){
    $('body').append(localStorage.getItem(localStorage.key(i)));
}

Se l'ordine è importante, puoi memorizzare un array serializzato in JSON:

localStorage.setItem("words", JSON.stringify(["Lorem", "Ipsum", "Dolor"]));

La bozza della specifica afferma che qualsiasi oggetto che supporta il clone strutturato può essere un valore. Ma questo non sembra ancora essere supportato.

EDIT: per caricare l'array, aggiungilo, quindi memorizza:

var words = JSON.parse(localStorage.getItem("words"));
words.push("hello");
localStorage.setItem("words", JSON.stringify(words));

Molte grazie! Questo è proprio quello che stavo cercando. Esaminerò anche la cosa JSON che hai inviato. Sarebbe perfetto. È per un'app iOS HTML5 offline di Baby Names.
Oscar Godson

Domanda veloce, come aggiungerei a quel JSON? Ad esempio, come aggiungerei "ciao" dopo "Dolor"?
Oscar Godson

1
rock, solo a guardarlo, dovrebbe funzionare. C'è un motivo per cui dovrei usare parse e non eval? Sto usando eval ora per ottenerlo da una stringa, ma l'analisi è migliore / più veloce?
Oscar Godson

1
@Oscar, parseè più sicuro perché ti protegge dall'esecuzione del codice. E spesso è anche molto più veloce. Vedi blog.mozilla.com/webdev/2009/02/12/native-json-in-firefox-31
Matthew Flaschen

1
@BBagi, restituisce qualunque sia l'ingresso, decodificato. Il livello più alto di un testo JSON può essere un oggetto o un array. ProvaJSON.parse('["Lorem", "Ipsum", "Dolor"]').length
Matthew Flaschen

32

Il modo più semplice è:

Object.keys(localStorage).forEach(function(key){
   console.log(localStorage.getItem(key));
});

24

Oltre a tutte le altre risposte, puoi utilizzare la funzione $ .each dalla libreria jQuery:

$.each(localStorage, function(key, value){

  // key magic
  // value magic

});

Alla fine, ottieni l'oggetto con:

JSON .parse (localStorage.getItem (localStorage.key (key)));


2
Funziona solo se stai usando jQuery. $è usato per altre librerie ed è spesso usato anche come alias per document.querySelectorAll. La domanda inoltre non è contrassegnata come domanda [jquery].
AnnanFay

9

Questo funziona per me in Chrome:

for(var key in localStorage) {
  $('body').append(localStorage.getItem(key));
}

1
Quale parte esattamente? Questo frammento utilizza jQuery come da domanda originale. Puoi provarlo nella console Chrome js? for(var key in localStorage) { console.log(localStorage.getItem(key)); }
jtblin

@jtblin L'ho appena provato, è tornato TypeError: Cannot call method 'toString' of null, quindi presumo che la 'chiave' stia restituendo null
Juan Carlos Alpizar Chinchilla

1
Funziona nelle versioni recenti di Chrome, Safari e Firefox
mndrix

1
@JuanCarlosAlpizarChinchilla non c'è "toString" nel codice, quindi ¯_ (ツ) _ / ¯. Come indicato nel commento sopra, funziona bene in tutti i browser recenti.
jtblin

@jtblin il mio commento è di due anni, quindi ¯_ (ツ) _ / ¯ grazie per la testa alta però
Juan Carlos Alpizar Chinchilla

1

Sulla base della risposta precedente, ecco una funzione che eseguirà il ciclo dell'archiviazione locale per chiave senza conoscere i valori della chiave.

function showItemsByKey() {
   var typeofKey = null;
   for (var key in localStorage) {
       typeofKey = (typeof localStorage[key]);
       console.log(key, typeofKey);
   }
}

Se esamini l'output della console vedrai che gli elementi aggiunti dal tuo codice hanno tutti un tipo di stringa. Mentre gli elementi incorporati sono funzioni {[codice nativo]} o, nel caso della proprietà length, un numero. È possibile utilizzare la variabile typeofKey per filtrare solo le stringhe in modo che vengano visualizzati solo gli elementi.

Nota che funziona anche se memorizzi un numero o un valore booleano come valore poiché sono entrambi memorizzati come stringhe.


1

Tutte queste risposte ignorano le differenze tra le implementazioni di localStorage nei browser. I contributori in questo dominio dovrebbero qualificare fortemente le loro risposte con le piattaforme che stanno descrivendo. Un'implementazione a livello di browser è documentata su https://developer.mozilla.org/en/docs/Web/API/Window/localStorage e, sebbene molto potente, contiene solo pochi metodi di base. Il passaggio tra i contenuti richiede una comprensione dell'implementazione specifica per i singoli browser.


Potresti fare un esempio di come una di queste risposte non funzionerebbe su un browser? È stato molto tempo fa, ma non ricordo di aver riscontrato alcun problema nel ricorrere a queste risposte
Oscar Godson,

Volevo che il mio commento fosse aggiunto allo stream generale, non a questo particolare post e potrebbe essere stato un po 'duro. All'epoca ero frustrato cercando di trovare una soluzione cross-browser. L'esempio di Steve Isenberg (sotto) contenente for (var key in localStorage) {typeofKey = (typeof localStorage [key]); console.log (key, typeofKey); } Non funziona sulle implementazioni webKit (provalo!)
StarTraX

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

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.