2010-07-28 17 views
447

Gdybym nie musiał localStorage, mój kod będzie wyglądać następująco:Jak przechowywać tablicę w localStorage?

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

To działa. Jednak muszę przechowywać tę zmienną w localStorage i jest dość uparta. Próbowałem:

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

Gdzie się mylę?

+0

Pisałem nawet kompletne rozwiązanie dla utrzymania tablic w localStorage lub sessionStorage w wątku ten został zamknięty jako duplikat, ponieważ wątek Nether naprawdę odpowiada na pytanie pierwotnie zadane przez Dave'a: http://stackoverflow.com/a/23516713/2208713.Mam nadzieję, że pomaga niektórym ludziom. –

+0

Łatwy sposób obsługi tego rodzaju stanu można użyć biblioteki opendb bardzo dobrze wykorzystać do obsługi tablicy, obiektu. Możesz śledzić ten link https://github.com/pankajbisht/openDB – pankaj98

Odpowiedz

857

localStorage obsługuje tylko ciągi. Użyj JSON.stringify() i JSON.parse().

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

//... 
var storedNames = JSON.parse(localStorage.getItem("names")); 
+3

JSON nie jest obsługiwany w IE7 i wcześniejszych wersjach. –

+280

@SaifBechan Nie martw się o IE 6/7, mówimy o 'localStorage' – tungd

+5

Czy ktoś może wyjaśnić, dlaczego musisz to zrobić i co się dzieje? –

15

Zastosowanie JSON.stringify() i JSON.parse() jak sugeruje nie! Zapobiega to prawdopodobnie rzadkiemu, ale możliwemu problemowi nazwy elementu, który obejmuje ogranicznik (na przykład nazwę uczestnika three|||bars).

+0

Czy możesz pokazać nam lepszą alternatywę? – Phil

+3

Nie zapewnia to odpowiedzi na pytanie. Aby skrytykować lub poprosić o wyjaśnienie od autora, pozostaw komentarz pod swoim postem. – ChiefTwoPencils

+0

@ChiefTwoPencils Czy przeczytałeś komentarze przed flagowaniem? – J0HN

4

Innym rozwiązaniem byłoby napisać otoki, które przechowują tablicę takiego:

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

usuwa narzut konwersji do formatu JSON, ale byłoby irytujące, jeśli trzeba usunąć elementy, jak trzeba by ponownie zindeksuj tablicę :)

+0

Zabija przyrost wydajności, nie JSONifying. –

+0

@CamiloMartin Tak, to prawdopodobnie prawda .. :) – Znarkus

+1

Zamiast 'names_length' użyj' names_keys' i nie musisz ponownie indeksować! Umożliwiłoby to również używanie kluczy strunowych. Oczywiście ma to sens tylko wtedy, gdy elementy tablicy są w rodzaju hugh. – PiTheNumber

91

Modele localStorage i sessionStorage mogą obsługiwać tylko łańcuchy. Możesz rozszerzyć domyślne obiekty pamięci do obsługi tablic i obiektów. Wystarczy włączyć ten skrypt i używać nowych metod:

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

Zastosowanie localStorage.setObj(key, value) zapisać tablicę lub obiekt i localStorage.getObj(key) aby je odzyskać. Te same metody działają z obiektem sessionStorage.

Jeśli po prostu użyjesz nowych metod w celu uzyskania dostępu do pamięci, każda wartość zostanie przekonwertowana na ciąg znaków JSON przed zapisaniem i przeanalizowaniem, zanim zostanie zwrócony przez pobierający.

Źródło: http://www.acetous.de/p/152

+0

gdybyś potrzebował ich wszystkich, jak byś je odzyskał? –

+0

Obiekty pamięci udostępniają właściwość "długość", aby określić liczbę zapisanych obiektów i metodę "klucz (indeks int)", aby uzyskać bieżący klucz. Więc możesz spróbować: 'for (var i = 0; i Sebastian

+1

@Sebastian za pomocą ** localStorage.length ** może być niepoprawny w niektórych przypadkach, jeśli strona internetowa jest również ** localStorage ** do przechowywania czegoś. –

3

Podejście JSON działa na IE 7 trzeba json2.js, z tym że działa doskonale i pomimo jednego komentarza, mówiąc inaczej jest localStorage na nim. to naprawdę wydaje się najlepszym rozwiązaniem przy najmniejszych kłopotach. Oczywiście można pisać skrypty, aby zrobić to samo, co json2, ale nie ma to większego sensu.

co najmniej z następującym łańcuchem wersji jest localStorage, ale jak już wspomniano, musisz dołączyć json2.js, ponieważ nie jest to uwzględnione przez samą przeglądarkę: 4.0 (zgodny, 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) (Chciałbym skomentowałem odpowiedź, ale nie mogę).

5

właśnie utworzony w ten sposób:

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'); 
+2

To jest coś, czego szukałem, z wyjątkiem tego, że chodziłoby klucze podanego obiektu i zapisać (pojedynczą) połączoną wartość w każdym z nich. Bardzo zobowiązany do inspiracji. – twobob

Powiązane problemy