HTML5 localStorage anahtarlarını alın


146

Sadece tüm önemli değerleri nasıl alacağımı merak ediyorum localStorage.


Basit bir JavaScript döngüsü ile değerleri almaya çalıştım

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

Ancak, yalnızca tuşlar 1'den başlayarak aşamalı sayılarsa çalışır.


Mevcut tüm verileri görüntülemek için tüm tuşları nasıl alabilirim?




Neden bu döngü i = 1 ile başlar ve i = localStorage.length ile biter? Test ettiğim tarayıcılarda (Chrome), döngü 0'dan başlamalı ve localStorage.length - 1'de bitmelidir
Louis LC

@LouisLC çünkü anahtarlarım için aşamalı sayılar kullanıyordum (ilişkisel veritabanındaki birincil anahtar gibi).
Simone

Yanıtlar:


36

ES2017'de şunları kullanabilirsiniz:

Object.entries(localStorage)

5
ve Object.keys()beklediğim gibi işler de var mı?

292
for (var key in localStorage){
   console.log(key)
}

EDIT: bu cevap çok upvotes alıyor, bu yüzden sanırım bu yaygın bir soru. Cevabımı tökezleyebilecek herkese borçlu gibi hissediyorum ve bunun bir güncelleme yapmayı kabul ettiği için "doğru" olduğunu düşünüyormuşum gibi hissediyorum. Gerçek şu ki, yukarıdaki örnek bunu yapmanın doğru yolu değildir . En iyi ve en güvenli yol bunu yapmaktır:

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

Bu linkte .... stackoverflow.com/questions/15313606/… ... neden localStorage'a erişmek için tüm bu garip yöntemleri kullanıyorlar?

2
"En iyi / en güvenli" kod için birkaç soru: 1) Neden localStorage.lengthdoğrudan beyan edip kullanmayasınız? 2) Neden for döngüsü içinde ilan ettiniz? 3) Neden ++itercih edilir i++?
Luciano Bargmann

8
Gerçekten denedin mi? ++ikesinlikle döngü başlangıç yapmazi = 1 . Parantez içindeki üçüncü ifade her yinelemeden sonra değerlendirilir . i++ve ++iher ikisi de tam olarak aynı etkiye sahiptir i. Fark olduğu ++iiçin değerlendirir yeni değeri iise, artan sonra i++değerlendirir değerine i önce artan. Burada kesinlikle bir fark yaratmaz, çünkü tek önem verdiğimiz şey iifadenin değeri değil, artmanın yan etkisidir .
Kevin Ennis

33
Object.keys(localStorage)IE <9'u desteklemeniz gerekmediği sürece, bugünlerde bu senaryo için mükemmel bir şekilde çalıştığını belirtmek gerekir.
Adrian

2
Ayrıca, anahtarın adını görüntülemek istiyorsanız, bunu localStorage.key( i )parça ile yapabileceğinizi not etmek de yararlıdır .
Sean Colombo

30

Bunun gibi kolayca görülebilen bir nesne oluşturmayı seviyorum.

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

Çerezlerle de benzer bir şey yapıyorum.

document.cookie.split(';').reduce(function(obj, str){ 
    var s = str.split('='); 
    obj[s[0].trim()] = s[1];
    return obj;
}, {});

1
Nesnelerin üzerinde bu yineleme tarzını seviyorum.
Jonathan Stellwag

12
function listAllItems(){  
    for (i=0; i<=localStorage.length-1; i++)  
    {  
        key = localStorage.key(i);  
        alert(localStorage.getItem(key));
    }  
}

9

Bu localStorage.key(index)işlevi, indexalmak istediğiniz n'inci nesnenin bulunduğu dize temsilini döndürmek için kullanabilirsiniz .


7

Tarayıcı HTML5 LocalStorage'ı destekliyorsa, bunu etkinleştirerek Array.prototype.map uygulamasını da uygulamalıdır:

Array.apply(0, new Array(localStorage.length)).map(function (o, i) {
    return localStorage.key(i);
})

Ayrıca new Array(this.localStorage.length).fill(0)imo uygulamaktan daha az hileli hissettiren de yapabilirsiniz .
Lenny

6

Anahtarları bulduğum sorudan beri, her anahtar ve değer çiftini göstermek için bahsettiğimi düşündüm, (Kevin'in cevabına göre) şöyle yapabilirsin:

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

Bu, verileri "key: value" biçiminde günlüğe kaydeder

(Kevin: İsterseniz bu bilgiyi cevabınıza almaktan çekinmeyin!)


1

Bu, localStorage'daki tüm anahtarları ve değerleri yazdırır:

ES6:

for (let i=0; i< localStorage.length; i++) {
    let key = localStorage.key(i);
    let value = localStorage[key];
    console.log(`localStorage ${key}:  ${value}`);
}

1

Bunun gibi anahtarlar ve değerler alabilirsiniz:

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

0

Kevin'e en iyi cevabı verdiğini kabul ediyorum, ancak bazen yerel depolamanızda aynı değerlere sahip farklı anahtarlarınız olduğunda, örneğin genel kullanıcılarınızın öğelerini sepetlerine kaç kez eklediklerini görmelerini istersiniz. o zaman bunu kullanmanız gerekir:

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

Object.keys(localStorage)Firefox'ta kullanamayacağından bahsetmiş olanlar için ... çünkü ironik olarak (Firefox spesifikasyonlara sadık olduğu için) Bunu düşün:

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

Çünkü key, getItem ve setItem prototypal yöntemleri Object.keys(localStorage)sadece döner ["key2"].

Böyle bir şey yapmak en iyisidir:

let t = [];
for (let i = 0; i < localStorage.length; i++) {
  t.push(localStorage.key(i));
}

@Darkrum Firefox spesifikasyonu doğru takip ettiğinden, anahtar, getItem ve setItem kullanırsanız eksik olurdu object.keys()... Bunu yansıtmak için cevabımı güncelleyeceğim.
Mike Ratcliffe

Sadece yerel depolama için spesifikasyonları okuyun ve bahsettiğiniz şeyi göremiyorum.
Darkrum

Ve object.keys () için spesifikasyonları okuyun, söylediğiniz şey doğruysa Firefox'un neyi yanlış yapmadığı gibi görünüyor.
Darkrum

@Darkrum html.spec.whatwg.org/multipage/… adresine bakın ve spesifikasyonun IDL'yi tanımladığını görebilirsiniz [Exposed=Window]. Bu tarif ettiğim davranışla sonuçlanır. Onunla belirtilmişse [Exposed=Window,OverrideBuiltins]bekliyoruz davranışı verecekti o ama Spec gelmez belirtmek OverrideBuiltins. Bununla ilgili bir tartışmayı burada whatwg
Mike Ratcliffe

Yine belirteceğim gibi bunun object.keys nasıl çalıştığı ile ilgisi yok. Mozillas'ın ayarlanmasına izin vermemeleri, spesifikasyonu nasıl yorumladıklarıdır. Açıkça Google, ne yaptığını biliyordu, çünkü özellikle başka yollarla yapılmadıkça değiştirilemeyen bir prototipin kendi özellikleriyle ilgisi var.
Darkrum

-3

Ayrıca adıyla da okuyabiliriz.

Diyelim ki değeri 'user' adında böyle kaydettik

localStorage.setItem('user', user_Detail);

Sonra kullanarak okuyabiliriz

localStorage.getItem('user');

Ben kullandım ve düzgün çalışıyor, for döngüsünü yapmaya gerek yok

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.