Durchlaufen von localStorage in HTML5 und JavaScript


92

Also dachte ich, ich könnte localStorage einfach wie ein normales Objekt durchlaufen, da es eine Länge hat. Wie kann ich das durchlaufen?

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

Wenn ich ein mache localStorage.length, kehrt es zurück, 3was korrekt ist. Ich würde also annehmen, dass eine for...inSchleife funktionieren würde.

Ich dachte so etwas wie:

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

Aber ohne Erfolg. Irgendwelche Ideen?

Die andere Idee, die ich hatte, war so etwas wie

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

In dem for...infunktioniert das.


Antworten:


142

Sie können die keyMethode verwenden. localStorage.key(index)Gibt den indexth-Schlüssel zurück (die Reihenfolge ist implementierungsdefiniert, aber konstant, bis Sie Schlüssel hinzufügen oder entfernen).

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

Wenn die Reihenfolge wichtig ist, können Sie ein JSON-serialisiertes Array speichern:

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

Der Entwurf der Spezifikation besagt, dass jedes Objekt, das strukturierten Klon unterstützt , ein Wert sein kann. Dies scheint jedoch noch nicht unterstützt zu werden.

BEARBEITEN: Um das Array zu laden, fügen Sie es hinzu und speichern Sie:

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

Vielen Dank! Das ist genau das, wonach ich gesucht habe. Ich werde mir die JSON-Sache ansehen, die Sie auch gesendet haben. Das wäre perfekt. Es ist für eine Offline-HTML5-iOS-App mit Babynamen.
Oscar Godson

Kurze Frage, wie würde ich diesem JSON hinzufügen? Wie würde ich "Hallo" nach "Dolor" hinzufügen?
Oscar Godson

1
du rockst, nur schau, es sollte funktionieren. Gibt es einen Grund, warum ich parse und nicht eval verwenden sollte? Ich benutze jetzt eval, um es von einem String zu bekommen, aber ist das Parsen besser / schneller?
Oscar Godson

1
@Oscar parseist sicherer, da es Sie vor der Codeausführung schützt. Und oft ist es auch viel schneller. Siehe blog.mozilla.com/webdev/2009/02/12/native-json-in-firefox-31
Matthew Flaschen

1
@BBagi, es gibt zurück, was auch immer die Eingabe ist, dekodiert. Die oberste Ebene eines JSON-Textes kann ein Objekt oder ein Array sein. Versuchen SieJSON.parse('["Lorem", "Ipsum", "Dolor"]').length
Matthew Flaschen

32

Der einfachste Weg ist:

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

24

Zusätzlich zu allen anderen Antworten können Sie die Funktion $ .each aus der jQuery-Bibliothek verwenden:

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

  // key magic
  // value magic

});

Holen Sie sich schließlich das Objekt mit:

JSON .parse (localStorage.getItem (localStorage.key (Schlüssel)));


2
Dies funktioniert nur, wenn Sie jQuery verwenden. $wird für andere Bibliotheken verwendet und wird häufig auch als Alias ​​für verwendet document.querySelectorAll. Die Frage ist auch nicht als [jquery] -Frage gekennzeichnet.
AnnanFay

9

Das funktioniert bei mir in Chrome:

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

1
Welcher Teil genau? Dieses Snippet verwendet jQuery gemäß der ursprünglichen Frage. Können Sie dies in Chrome JS Konsole versuchen? for(var key in localStorage) { console.log(localStorage.getItem(key)); }
Jtblin

@jtblin Ich habe es gerade versucht, es kehrte zurück TypeError: Cannot call method 'toString' of null, also gehe ich davon aus, dass 'Schlüssel' null zurückgibt
Juan Carlos Alpizar Chinchilla

1
Dies funktioniert in neueren Versionen von Chrome, Safari und Firefox
Mndrix

1
@JuanCarlosAlpizarChinchilla Es gibt keinen 'toString' im Code, also ¯_ (ツ) _ / ¯. Wie im obigen Kommentar erwähnt, funktioniert es in allen aktuellen Browsern einwandfrei.
Jtblin

@jtblin mein Kommentar ist zwei Jahre alt, also ¯_ (ツ) _ / ¯ danke für den Kopf hoch
Juan Carlos Alpizar Chinchilla

1

Aufbauend auf der vorherigen Antwort ist hier eine Funktion, die den lokalen Speicher nach Schlüssel durchläuft, ohne die Schlüsselwerte zu kennen.

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

Wenn Sie die Konsolenausgabe untersuchen, sehen Sie, dass die von Ihrem Code hinzugefügten Elemente alle eine Zeichenfolge haben. Während die eingebauten Elemente entweder Funktionen {[nativer Code]} oder im Fall der Längeneigenschaft eine Zahl sind. Sie können die Variable typeofKey verwenden, um nur nach den Zeichenfolgen zu filtern, sodass nur Ihre Elemente angezeigt werden.

Beachten Sie, dass dies auch dann funktioniert, wenn Sie eine Zahl oder einen Booleschen Wert als Wert speichern, da beide als Zeichenfolgen gespeichert sind.


1

Alle diese Antworten ignorieren die Unterschiede zwischen den Implementierungen von localStorage in verschiedenen Browsern. Mitwirkende in diesem Bereich sollten ihre Antworten mit den von ihnen beschriebenen Plattformen stark qualifizieren. Eine browserweite Implementierung ist unter https://developer.mozilla.org/en/docs/Web/API/Window/localStorage dokumentiert und enthält, obwohl sie sehr leistungsfähig ist, nur einige Kernmethoden. Das Durchlaufen der Inhalte erfordert ein Verständnis der Implementierung, die für einzelne Browser spezifisch ist.


Können Sie ein Beispiel geben, wie eine dieser Antworten in einem Browser nicht funktioniert? Das ist lange her, aber ich kann mich nicht erinnern, dass ich Probleme beim Durchlaufen dieser Antworten hatte
Oscar Godson,

Ich wollte, dass mein Kommentar zum Gesamt-Stream hinzugefügt wird, nicht zu diesem bestimmten Beitrag, und war möglicherweise etwas hart. Ich war damals frustriert, als ich nach einer browserübergreifenden Lösung suchte. Das Beispiel von Steve Isenberg (unten) enthält for (var key in localStorage) {typeofKey = (typeof localStorage [key]); console.log (Schlüssel, Typ des Schlüssels); } Funktioniert nicht bei WebKit-Implementierungen (probieren Sie es aus!)
StarTraX

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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.