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?




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)

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 ) ) );
}

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;
}, {});

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));
    }  
}

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ć.


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);
})

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!)


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}`);
}

1

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

for (let [key, value] of Object.entries(localStorage)) {
  console.log(`${key}: ${value}`);
}

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;
}

-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));
}

@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

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.