Przechodzenie przez localStorage w HTML5 i JavaScript


95

Więc pomyślałem, że mógłbym po prostu zapętlić localStorage jak normalny obiekt, ponieważ ma długość. Jak mogę przez to przejść?

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

Jeśli zrobię localStorage.length, zwraca, 3co jest poprawne. Więc zakładam, że for...inpętla zadziała.

Myślałem o czymś takim:

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

Ale bezskutecznie. Jakieś pomysły?

Inny pomysł, jaki miałem, był taki

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

W którym for...indziała.


Odpowiedzi:


146

Możesz użyć keymetody. localStorage.key(index)zwraca indexth klucz (kolejność jest zdefiniowana w ramach implementacji, ale stała do momentu dodania lub usunięcia kluczy).

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

Jeśli kolejność ma znaczenie, możesz przechowywać tablicę zserializowaną JSON:

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

Wersja robocza specyfikacji twierdzi, że każdy obiekt obsługujący klon strukturalny może być wartością. Ale to nie wydaje się być jeszcze obsługiwane.

EDYCJA: Aby załadować tablicę, dodaj do niej, a następnie zapisz:

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

Wielkie dzięki! Właśnie tego szukałem. Zajrzę się również przesyłką JSON, którą wysłałeś. To byłoby idealne. To jest dla aplikacji Baby Names Offline HTML5 iOS.
Oscar Godson

Szybkie pytanie, jak dodać do tego JSON? Na przykład, jak dodałbym „cześć” po „Dolor”?
Oscar Godson

1
kołyszesz, wystarczy patrzeć, to powinno działać. Czy istnieje powód, dla którego powinienem używać parse, a nie eval? Używam teraz eval, aby pobrać go z łańcucha, ale czy parsowanie jest lepsze / szybsze?
Oscar Godson

1
@Oscar parsejest bezpieczniejszy, ponieważ chroni Cię przed wykonaniem kodu. Często jest też znacznie szybszy. Zobacz blog.mozilla.com/webdev/2009/02/12/native-json-in-firefox-31
Matthew Flaschen

1
@BBagi, zwraca zdekodowane dane wejściowe. Najwyższy poziom tekstu JSON może być obiektem lub tablicą. SpróbujJSON.parse('["Lorem", "Ipsum", "Dolor"]').length
Matthew Flaschen

34

Najprostszy sposób to:

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

24

Oprócz wszystkich innych odpowiedzi możesz użyć funkcji $ .each z biblioteki jQuery:

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

  // key magic
  // value magic

});

Ostatecznie zdobądź obiekt z:

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


2
Działa to tylko wtedy, gdy używasz jQuery. $jest używany dla innych bibliotek i często jest również używany jako alias dla document.querySelectorAll. Pytanie nie jest również oznaczone jako pytanie [jquery].
AnnanFay,

9

To działa dla mnie w Chrome:

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

1
Która część dokładnie? Ten fragment kodu używa jQuery zgodnie z oryginalnym pytaniem. Czy możesz spróbować tego w konsoli chrome js? for(var key in localStorage) { console.log(localStorage.getItem(key)); }
jtblin

@jtblin Właśnie go wypróbowałem, wrócił TypeError: Cannot call method 'toString' of null, więc zakładam, że „klucz” zwraca wartość null
Juan Carlos Alpizar Chinchilla

1
Działa to w najnowszych wersjach przeglądarki Chrome, Safari i Firefox
mndrix

1
@JuanCarlosAlpizarChinchilla nie ma 'toString' w kodzie, więc ¯_ (ツ) _ / ¯. Jak wskazano w komentarzu powyżej, działa dobrze we wszystkich najnowszych przeglądarkach.
jtblin

@jtblin mój komentarz ma dwa lata, więc ¯_ (ツ) _ / ¯ dziękuję za głowę do góry
Juan Carlos Alpizar Chinchilla

1

Opierając się na poprzedniej odpowiedzi, jest to funkcja, która będzie przechodzić przez lokalną pamięć według klucza bez znajomości wartości kluczy.

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

Jeśli przeanalizujesz dane wyjściowe konsoli, zobaczysz, że elementy dodane przez twój kod mają typ string. Natomiast elementy wbudowane są albo funkcjami {[kod natywny]}, albo w przypadku właściwości length liczbą. Możesz użyć zmiennej typeofKey, aby odfiltrować tylko ciągi znaków, aby wyświetlane były tylko elementy.

Zauważ, że działa to nawet jeśli przechowujesz liczbę lub wartość logiczną jako wartość, ponieważ oba są przechowywane jako ciągi.


1

Wszystkie te odpowiedzi ignorują różnice między implementacjami localStorage w różnych przeglądarkach. Współautorzy w tej domenie powinni ściśle kwalifikować swoje odpowiedzi do opisywanych przez siebie platform. Jedna implementacja dla całej przeglądarki jest udokumentowana na https://developer.mozilla.org/en/docs/Web/API/Window/localStorage i chociaż jest bardzo potężna, zawiera tylko kilka podstawowych metod. Przeglądanie zawartości wymaga zrozumienia implementacji specyficznej dla poszczególnych przeglądarek.


Czy możesz podać przykład, w jaki sposób jedna z tych odpowiedzi nie działałaby w przeglądarce? To było dawno temu, ale nie pamiętam, abym napotkał jakiekolwiek problemy z przeglądaniem tych odpowiedzi
Oscar Godson,

Chciałem, aby mój komentarz został dodany do całego strumienia, a nie do tego konkretnego posta i mógł być nieco szorstki. Byłem wtedy sfrustrowany, próbując znaleźć rozwiązanie dla różnych przeglądarek. Przykład autorstwa Steve'a Isenberga (poniżej) zawierający for (klucz var w localStorage) {typeofKey = (typeof localStorage [klucz]); console.log (klucz, typeofKey); } Nie działa z implementacjami webKit (spróbuj!)
StarTraX,

To działa: for (var i = 0; i <localStorage.length; ++ i) {console.log (localStorage.key (i) + ":" + localStorage.getItem (localStorage.key (i))); }
StarTraX,

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.