it-swarm.com.de

Wie speichere ich ein Array in localStorage?

Wenn ich localStorage nicht benötige, würde mein Code so aussehen:

var names=new Array(); 
names[0]=Prompt("New member name?");

Das funktioniert. Ich muss diese Variable jedoch in localStorage speichern und sie erweist sich als ziemlich hartnäckig. Ich habe es versucht:

var localStorage[names] = new Array();
localStorage.names[0] = Prompt("New member name?");

Wo gehe ich falsch?

564
David

localStorage unterstützt nur Zeichenfolgen. Verwenden Sie JSON.stringify() und JSON.parse().

var names = [];
names[0] = Prompt("New member name?");
localStorage.setItem("names", JSON.stringify(names));

//...
var storedNames = JSON.parse(localStorage.getItem("names"));
1046
Dagg Nabbit

localStorage und sessionStorage können nur Zeichenfolgen verarbeiten. Sie können die Standardspeicherobjekte erweitern, um Arrays und Objekte zu verarbeiten. Schließen Sie einfach dieses Skript ein und verwenden Sie die neuen Methoden:

Storage.prototype.setObj = function(key, obj) {
    return this.setItem(key, JSON.stringify(obj))
}
Storage.prototype.getObj = function(key) {
    return JSON.parse(this.getItem(key))
}

Verwenden Sie localStorage.setObj(key, value), um ein Array oder Objekt zu speichern, und localStorage.getObj(key), um es abzurufen. Dieselben Methoden funktionieren mit dem Objekt sessionStorage.

Wenn Sie nur die neuen Methoden verwenden, um auf den Speicher zuzugreifen, wird jeder Wert vor dem Speichern in eine JSON-Zeichenfolge konvertiert und analysiert, bevor er vom Getter zurückgegeben wird.

Quelle: http://www.acetous.de/p/152

107
Sebastian

Verwenden Sie JSON.stringify() und JSON.parse(), wie von no vorgeschlagen! Dies verhindert das möglicherweise seltene, aber mögliche Problem eines Mitgliedsnamens, der das Trennzeichen enthält (z. B. Mitgliedsname three|||bars).

16
jayeff

Soeben erstellt:

https://Gist.github.com/3854049

//Setter
Storage.setObj('users.albums.sexPistols',"blah");
Storage.setObj('users.albums.sexPistols',{ sid : "My Way", nancy : "Bitch" });
Storage.setObj('users.albums.sexPistols.sid',"Other songs");

//Getters
Storage.getObj('users');
Storage.getObj('users.albums');
Storage.getObj('users.albums.sexPistols');
Storage.getObj('users.albums.sexPistols.sid');
Storage.getObj('users.albums.sexPistols.nancy');
6
Klederson Bueno

Der JSON-Ansatz funktioniert, auf zB 7 brauchen Sie json2.js, damit funktioniert es perfekt und obwohl der eine Kommentar sagt, dass es sonst localStorage gibt. Es scheint wirklich die beste Lösung mit dem geringsten Aufwand. Natürlich könnte man Skripte schreiben, um im Wesentlichen dasselbe zu tun wie json2, aber das hat wenig Sinn.

zumindest mit der folgenden Versionszeichenfolge gibt es localStorage, aber wie gesagt, müssen Sie json2.js einschließen, da dies vom Browser selbst nicht berücksichtigt wird: 4.0 (kompatibel; MSIE 7.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2) ; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; BRI/2; NP06; .NET4.0C; .NET4.0E; Zune 4.7) (Ich hätte dies kommentiert die Antwort, kann aber nicht).

3
Lassi Kinnunen

Eine andere Lösung wäre, einen Wrapper zu schreiben, der das Array wie folgt speichert:

localStorage.setItem('names_length', names.length);
localStorage.setItem('names_0', names[0]);
localStorage.setItem('names_1', names[1]);
localStorage.setItem('names_' + n, names[n]);

Entfernt den Aufwand für die Konvertierung in JSON, wäre aber ärgerlich, wenn Sie Elemente entfernen müssten, da Sie das Array neu indizieren müssten :)

2
Znarkus