Looping melalui localStorage di HTML5 dan JavaScript


94

Jadi, saya berpikir saya bisa melakukan loop melalui localStorage seperti objek normal karena memiliki panjang. Bagaimana saya bisa mengulang ini?

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

Jika saya melakukan localStorage.lengthitu kembali 3yang benar. Jadi saya akan berasumsi sebuah for...inloop akan berhasil.

Saya sedang memikirkan sesuatu seperti:

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

Tapi tidak berhasil. Ada ide?

Ide lain yang saya miliki adalah sesuatu seperti

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

Di mana yang for...inberhasil.


Jawaban:


145

Anda bisa menggunakan keymetode ini. localStorage.key(index)mengembalikan indexkunci th (urutannya ditentukan oleh implementasi tetapi tetap sampai Anda menambahkan atau menghapus kunci).

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

Jika urutannya penting, Anda bisa menyimpan array serial JSON:

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

Spesifikasi draf mengklaim bahwa objek apa pun yang mendukung penggandaan terstruktur dapat menjadi sebuah nilai. Tapi ini sepertinya belum didukung.

EDIT: Untuk memuat array, tambahkan ke dalamnya, lalu simpan:

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

Terima kasih banyak! Inilah yang saya cari. Saya juga akan memeriksa hal JSON yang Anda kirim. Itu akan sempurna. Ini untuk aplikasi iOS Baby Names Offline HTML5.
Oscar Godson

Pertanyaan singkat, bagaimana saya menambahkan JSON itu? Seperti, bagaimana cara menambahkan "halo" setelah "Dolor"?
Oscar Godson

1
Anda keren, hanya dengan melihat, itu akan berhasil. Apakah ada alasan saya harus menggunakan parse dan bukan eval? Saya menggunakan eval sekarang untuk mendapatkannya dari string, tetapi apakah parse lebih baik / lebih cepat?
Oscar Godson

1
@Oscar, parselebih aman karena melindungi Anda dari eksekusi kode. Dan seringkali, itu juga lebih cepat. Lihat blog.mozilla.com/webdev/2009/02/12/native-json-in-firefox-31
Matthew Flaschen

1
@BBagi, ia mengembalikan apa pun masukannya, diterjemahkan. Tingkat atas teks JSON dapat berupa objek atau larik. CobaJSON.parse('["Lorem", "Ipsum", "Dolor"]').length
Matthew Flaschen

34

Cara yang paling sederhana adalah:

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

24

Selain semua jawaban lainnya, Anda dapat menggunakan fungsi $ .each dari pustaka jQuery:

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

  // key magic
  // value magic

});

Akhirnya, dapatkan objek dengan:

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


2
Ini hanya berfungsi jika Anda menggunakan jQuery. $digunakan untuk perpustakaan lain dan juga sering digunakan sebagai alias untuk document.querySelectorAll. Pertanyaan tersebut juga tidak ditandai sebagai pertanyaan [jquery].
AnnanFay

9

Ini berfungsi untuk saya di Chrome:

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

1
Bagian mana tepatnya? Cuplikan ini menggunakan jQuery sesuai pertanyaan asli. Bisakah Anda mencoba ini di konsol chrome js? for(var key in localStorage) { console.log(localStorage.getItem(key)); }
jtblin

@jtblin Saya baru saja mencobanya, itu kembali TypeError: Cannot call method 'toString' of null, jadi saya berasumsi 'kunci' mengembalikan null
Juan Carlos Alpizar Chinchilla

1
Ini berfungsi di versi terbaru Chrome, Safari, dan Firefox
mndrix

1
@JuanCarlosAlpizarChinchilla tidak ada 'toString' di kode jadi ¯_ (ツ) _ / ¯. Seperti yang ditunjukkan pada komentar di atas, berfungsi dengan baik di semua browser terbaru.
jtblin

@jtblin komentar saya berusia dua tahun, jadi ¯_ (ツ) _ / ¯ terima kasih atas perhatiannya
Juan Carlos Alpizar Chinchilla

1

Membangun dari jawaban sebelumnya di sini adalah fungsi yang akan melewati penyimpanan lokal dengan kunci tanpa mengetahui nilai kunci.

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

Jika Anda memeriksa output konsol, Anda akan melihat item yang ditambahkan oleh kode Anda semuanya memiliki tipe string. Sedangkan item bawaan adalah salah satu fungsi {[kode asli]} atau dalam kasus properti panjang berupa angka. Anda dapat menggunakan variabel typeofKey untuk memfilter hanya pada string sehingga hanya item Anda yang ditampilkan.

Perhatikan bahwa ini berfungsi bahkan jika Anda menyimpan angka atau boolean sebagai nilai karena keduanya disimpan sebagai string.


1

Semua jawaban ini mengabaikan perbedaan antara implementasi localStorage di seluruh browser. Kontributor dalam domain ini harus sangat memenuhi syarat tanggapan mereka dengan platform yang mereka gambarkan. Implementasi satu browser-lebar didokumentasikan di https://developer.mozilla.org/en/docs/Web/API/Window/localStorage dan, meskipun sangat kuat, hanya berisi beberapa metode inti. Perulangan melalui konten membutuhkan pemahaman tentang implementasi khusus untuk masing-masing browser.


Bisakah Anda memberikan contoh bagaimana salah satu jawaban ini tidak akan berfungsi di browser? Ini sudah lama sekali, tetapi saya tidak ingat mengalami masalah apa pun dengan mengulang-ulang jawaban ini
Oscar Godson

Saya bermaksud agar komentar saya ditambahkan ke aliran keseluruhan, bukan postingan khusus ini dan mungkin agak kasar. Saya frustrasi saat mencoba mencari solusi lintas-browser. Contoh oleh Steve Isenberg (di bawah) yang berisi for (var key in localStorage) {typeofKey = (typeof localStorage [key]); console.log (key, typeofKey); } Tidak berfungsi pada implementasi webKit (coba!)
StarTraX

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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.