Uzyskaj klucze lokalnego magazynu HTML5

145

Zastanawiam się tylko, jak uzyskać wszystkie kluczowe wartości localStorage.


Próbowałem pobrać wartości za pomocą prostej pętli JavaScript

for (var i=1; i <= localStorage.length; i++)  {
   alert(localStorage.getItem(i))
}

Ale działa tylko wtedy, gdy klawisze są numerami progresywnymi, zaczynając od 1.


Jak zdobyć wszystkie klucze, aby wyświetlić wszystkie dostępne dane?

Simone
źródło
możliwy duplikat stackoverflow.com/questions/3138564/ ...
kubetz
Dlaczego ta pętla zaczyna się od i = 1 i kończy na i = localStorage.length? W przeglądarkach, które testowałem (Chrome), pętla powinna zaczynać się od 0 i kończyć na localStorage.length - 1 ...
Louis LC
@LouisLC, ponieważ używałem numerów progresywnych dla moich kluczy (jak klucz podstawowy w relacyjnej bazie danych).
Simone,

Odpowiedzi:

35

w ES2017 możesz użyć:

Object.entries(localStorage)
nktshn
źródło
5
i zakładam, że Object.keys()działa zgodnie z oczekiwaniami?
292
for (var key in localStorage){
   console.log(key)
}

EDYCJA: ta odpowiedź jest bardzo pozytywna, więc myślę, że jest to częste pytanie. Czuję, że jestem to winny każdemu, kto mógłby natknąć się na moją odpowiedź i pomyśleć, że jest to „właściwe” tylko dlatego, że zaakceptowano dokonanie aktualizacji. Prawda jest taka, że ​​powyższy przykład nie jest właściwym sposobem, aby to zrobić. Najlepszym i najbezpieczniejszym sposobem jest zrobienie tego w następujący sposób:

for ( var i = 0, len = localStorage.length; i < len; ++i ) {
  console.log( localStorage.getItem( localStorage.key( i ) ) );
}
Kevin Ennis
źródło
W tym linku… stackoverflow.com/questions/15313606/…… dlaczego używają tych wszystkich dziwnych metod, aby uzyskać dostęp do localStorage?
2
Kilka pytań dotyczących „najlepszego / najbezpieczniejszego” kodu: 1) Po co go deklarować localStorage.lengthi nie używać go bezpośrednio? 2) Po co deklarować to w pętli for? 3) Dlaczego ++ijest bardziej preferowany i++?
Luciano Bargmann
8
Naprawdę tego próbowałeś? ++izdecydowanie nie sprawia, że ​​pętla zaczyna się od i = 1. Trzecie wyrażenie w nawiasach jest oceniane po każdej iteracji. i++i ++ioba mają dokładnie ten sam efekt i. Różnica polega na tym, że ++iszacuje się do nowej wartości ipo zwiększeniu, podczas gdy i++szacuje się do wartości i przed zwiększeniem. Nie ma tu absolutnie żadnej różnicy, ponieważ wszystko, na czym nam zależy, to efekt uboczny inkrementacji i, a nie wartość wyrażenia.
Kevin Ennis
33
Warto zauważyć, że w dzisiejszych czasach Object.keys(localStorage)doskonale sprawdza się w tym scenariuszu, o ile nie musisz wspierać IE <9.
Adrian
2
Warto również zauważyć, że jeśli chcesz wyświetlić nazwę samego klucza, możesz to zrobić z localStorage.key( i )częścią.
Sean Colombo
30

Lubię w ten sposób tworzyć z tego dobrze widoczny obiekt.

Object.keys(localStorage).reduce(function(obj, str) { 
    obj[str] = localStorage.getItem(str); 
    return obj
}, {});

Podobnie robię z ciasteczkami.

document.cookie.split(';').reduce(function(obj, str){ 
    var s = str.split('='); 
    obj[s[0].trim()] = s[1];
    return obj;
}, {});
Zack Argyle
źródło
1
Podoba mi się ten styl iteracji po obiektach.
Jonathan Stellwag
12
function listAllItems(){  
    for (i=0; i<=localStorage.length-1; i++)  
    {  
        key = localStorage.key(i);  
        alert(localStorage.getItem(key));
    }  
}
nerdcoder
źródło
9

Możesz użyć tej localStorage.key(index)funkcji, aby zwrócić reprezentację ciągu, gdzie indexjest n-ty obiekt, który chcesz pobrać.

Jeffrey Sweeney
źródło
7

Jeśli przeglądarka obsługuje HTML5 LocalStorage, powinna również zaimplementować Array.prototype.map, umożliwiając to:

Array.apply(0, new Array(localStorage.length)).map(function (o, i) {
    return localStorage.key(i);
})
glina
źródło
Możesz także zrobić to, new Array(this.localStorage.length).fill(0)co wydaje się nieco mniej hakerskie niż użycie Apply imo.
Lenny
6

Ponieważ pytanie dotyczyło znalezienia kluczy, pomyślałem, że wspomnę, że aby pokazać każdą parę kluczy i wartości, możesz to zrobić w następujący sposób (na podstawie odpowiedzi Kevina):

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

Spowoduje to zarejestrowanie danych w formacie „klucz: wartość”

(Kevin: jeśli chcesz, możesz po prostu wziąć te informacje do swojej odpowiedzi!)

Sean Colombo
źródło
1

Spowoduje to wydrukowanie wszystkich kluczy i wartości w localStorage:

ES6:

for (let i=0; i< localStorage.length; i++) {
    let key = localStorage.key(i);
    let value = localStorage[key];
    console.log(`localStorage ${key}:  ${value}`);
}
Rahim Naik
źródło
1

Możesz uzyskać klucze i wartości w ten sposób:

for (let [key, value] of Object.entries(localStorage)) {
  console.log(`${key}: ${value}`);
}
Admir
źródło
0

Zgadzam się z Kevinem, że ma najlepszą odpowiedź, ale czasami, gdy masz różne klucze w lokalnej pamięci o tych samych wartościach, na przykład chcesz, aby użytkownicy publiczni widzieli, ile razy dodali swoje przedmioty do swoich koszyków, musisz im pokazać ile razy możesz użyć tego:

var set = localStorage.setItem('key', 'value');
var element = document.getElementById('tagId');

for ( var i = 0, len = localStorage.length; i < len; ++i ) {
  element.innerHTML =  localStorage.getItem(localStorage.key(i)) + localStorage.key(i).length;
}
Hassan Azimi
źródło
-1

Dla tych, którzy wspominają o używaniu Object.keys(localStorage)... nie, ponieważ nie będzie działać w Firefoksie (jak na ironię, ponieważ Firefox jest wierny specyfikacji). Rozważ to:

localStorage.setItem("key", "value1")
localStorage.setItem("key2", "value2")
localStorage.setItem("getItem", "value3")
localStorage.setItem("setItem", "value4")

Ponieważ key, getItem i setItem to metody prototypowe, Object.keys(localStorage)zwrócą tylko wartość ["key2"].

Najlepiej zrobić coś takiego:

let t = [];
for (let i = 0; i < localStorage.length; i++) {
  t.push(localStorage.key(i));
}
Mike Ratcliffe
źródło
@Darkrum Ponieważ Firefox poprawnie przestrzega specyfikacji, nie byłoby kluczy, getItem i setItem, jeśli użyjesz object.keys()... Zaktualizuję moją odpowiedź, aby to odzwierciedlić.
Mike Ratcliffe
Po prostu przeczytaj specyfikację lokalnego przechowywania i nie widzę, o czym wspomniałeś.
Darkrum
Przeczytaj specyfikację object.keys () wygląda na to, że Firefox jest tym, czego nie wypada, jeśli to, co mówisz, jest prawdą.
Darkrum
@Darkrum Spójrz na html.spec.whatwg.org/multipage/ ... i zobaczysz, że specyfikacja definiuje IDL z [Exposed=Window]. Powoduje to zachowanie, które opisuję. Gdyby został określony za pomocą [Exposed=Window,OverrideBuiltins], dałoby zachowanie, którego oczekujemy, ale specyfikacja nie określa OverrideBuiltins. Możesz zobaczyć dyskusję na ten temat w whatwg / html tutaj: github.com/whatwg/html/issues/183
Mike Ratcliffe
Ponownie, jak powiem, nie ma to nic wspólnego z działaniem object.keys. Wybór Mozilli, aby nie zezwolić na ich ustawienie, jest sposobem interpretacji specyfikacji. Najwyraźniej Google wiedział, co robi, ponieważ to, co robi prototyp, którego nie można zmienić, chyba że zrobiono to w inny sposób, ma cokolwiek wspólnego z własnymi właściwościami.
Darkrum
-3

Możemy też czytać po imieniu.

Powiedzmy, że zapisaliśmy wartość pod nazwą „użytkownik” w ten sposób

localStorage.setItem('user', user_Detail);

Następnie możemy go przeczytać za pomocą

localStorage.getItem('user');

Użyłem go i działa płynnie, nie ma potrzeby wykonywania pętli for

Ali Adravi
źródło