HTML5 ve JavaScript'te localStorage üzerinden döngü


94

Bu yüzden, bir uzunluğu olduğu için localStorage'da normal bir nesne gibi döngü yapabileceğimi düşünüyordum. Bunu nasıl aşabilirim?

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

Eğer bir yaparsam , doğru olan localStorage.lengthgeri döner 3. Yani bir for...indöngünün işe yarayacağını varsayıyorum .

Şöyle bir şey düşünüyordum:

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

Ama boşuna. Herhangi bir fikir?

Aklıma gelen diğer fikir şuydu:

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

Hangi for...iniş yapar.


Yanıtlar:


145

keyYöntemi kullanabilirsiniz . th anahtarını localStorage.key(index)döndürür index(sıra uygulama tanımlıdır ancak siz anahtar ekleyip kaldırana kadar sabittir).

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

Sipariş önemliyse, JSON serileştirilmiş bir dizi depolayabilirsiniz:

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

Taslak spesifikasyon, yapılandırılmış klonu destekleyen herhangi bir nesnenin bir değer olabileceğini iddia ediyor . Ancak bu henüz desteklenmiyor gibi görünüyor.

DÜZENLEME: Diziyi yüklemek için ona ekleyin, sonra saklayın:

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

Çok teşekkürler! Tam da aradığım buydu. Gönderdiğiniz JSON şeyine de bakacağım. Bu mükemmel olur. Bebek İsimleri Çevrimdışı HTML5 iOS uygulaması içindir.
Oscar Godson

Hızlı soru, bu JSON'a nasıl eklerim? Mesela "Dolor" dan sonra "merhaba" kelimesini nasıl eklerim?
Oscar Godson

1
sallıyorsun, sadece bakıyorsun, çalışmalı. Değerlendirmemek yerine ayrıştırmayı kullanmamın bir nedeni var mı? Şimdi bir dizeden almak için eval kullanıyorum, ancak ayrıştırma daha iyi / daha hızlı mı?
Oscar Godson

1
@Oscar, parsesizi kod yürütmekten koruduğu için daha güvenlidir. Ve çoğu zaman çok daha hızlıdır. Bkz blog.mozilla.com/webdev/2009/02/12/native-json-in-firefox-31
Matthew Flaschen

1
@BBagi, girdi ne olursa olsun kodu çözülür. JSON metninin en üst seviyesi bir nesne veya dizi olabilir. DeneyinJSON.parse('["Lorem", "Ipsum", "Dolor"]').length
Matthew Flaschen

34

En basit yol şudur:

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

24

Diğer tüm yanıtlara ek olarak , jQuery kitaplığından $ .each işlevini kullanabilirsiniz :

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

  // key magic
  // value magic

});

Sonunda, nesneyi şu şekilde alın:

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


2
Bu yalnızca jQuery kullanıyorsanız çalışır. $diğer kitaplıklar için kullanılır ve aynı zamanda için takma ad olarak da kullanılır document.querySelectorAll. Soru ayrıca bir [jquery] sorusu olarak etiketlenmez.
AnnanFay

9

Bu benim için Chrome'da çalışıyor:

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

1
Tam olarak hangi kısım? Bu pasaj, orijinal soruya göre jQuery kullanır. Bunu chrome js konsolunda deneyebilir misin? for(var key in localStorage) { console.log(localStorage.getItem(key)); }
jtblin

@jtblin Az önce denedim, geri döndü TypeError: Cannot call method 'toString' of null, bu yüzden 'anahtar'ın boş döndüğünü varsayıyorum
Juan Carlos Alpizar Chinchilla

1
Bu, Chrome, Safari ve Firefox'un son sürümlerinde çalışır
mndrix

1
@JuanCarlosAlpizarChinchilla kodda 'toString' yok, bu yüzden ¯_ (ツ) _ / ¯. Yukarıdaki yorumda belirtildiği gibi, tüm yeni tarayıcılarda iyi çalışıyor.
jtblin

@jtblin yorumum iki yaşında, bu yüzden ¯_ (ツ) _ / ¯ yine de başınız için teşekkürler
Juan Carlos Alpizar Chinchilla

1

Buradaki önceki cevaba dayanarak, anahtar değerlerini bilmeden yerel depolamada anahtara göre döngü yapacak bir işlev var.

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

Konsol çıktısını incelerseniz, kodunuz tarafından eklenen öğelerin hepsinin bir typeof dizesine sahip olduğunu göreceksiniz. Yerleşik öğeler, işlevler {[yerel kod]} veya uzunluk özelliği durumunda bir sayıdır. Yalnızca dizeleri filtrelemek için typeofKey değişkenini kullanabilirsiniz, böylece yalnızca öğeleriniz görüntülenir.

Her ikisi de dize olarak depolandıklarından değer olarak bir sayı veya boole saklasanız bile bunun işe yaradığını unutmayın.


1

Tüm bu yanıtlar, tarayıcılarda localStorage uygulamaları arasındaki farkları göz ardı eder. Bu alandaki katkıda bulunanlar, açıkladıkları platformlarla yanıtlarını büyük ölçüde nitelendirmelidir. Tarayıcı çapında bir uygulama https://developer.mozilla.org/en/docs/Web/API/Window/localStorage adresinde belgelenmiştir ve çok güçlü olmasına rağmen yalnızca birkaç temel yöntem içerir. İçerikler arasında döngü yapmak, tek tek tarayıcılara özgü uygulamanın anlaşılmasını gerektirir.


Bu cevaplardan birinin bir tarayıcıda nasıl çalışmayacağına dair bir örnek verebilir misiniz? Bu çok uzun zaman önceydi, ancak bu cevaplarla ilgili olarak herhangi bir sorunla karşılaştığımı hatırlamıyorum
Oscar Godson

Yorumumun bu belirli gönderiye değil genel akışa eklenmesini amaçladım ve biraz sert olabilirdi. Tarayıcılar arası bir çözüm bulmaya çalışırken hayal kırıklığına uğradım. Steve Isenberg'in hazırladığı örnek (aşağıda) for (localStorage'da var key) {typeofKey = (typeof localStorage [key]); console.log (anahtar, typeofKey); } WebKit uygulamalarında çalışmıyor (deneyin!)
StarTraX

Bu işe yarar: for (var i = 0; i <localStorage.length; ++ i) {console.log (localStorage.key (i) + ":" + localStorage.getItem (localStorage.key (i))); }
StarTraX

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.