Dapatkan HTML5 kunci Penyimpanan lokal

145

Saya hanya ingin tahu bagaimana cara memasukkan semua nilai kunci localStorage.


Saya telah mencoba mengambil nilai-nilai dengan loop JavaScript sederhana

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

Tapi itu hanya berfungsi jika kunci adalah angka progresif, mulai dari 1.


Bagaimana cara mendapatkan semua kunci, untuk menampilkan semua data yang tersedia?

Simone
sumber
kemungkinan duplikat dari stackoverflow.com/questions/3138564/…
kubetz
Mengapa loop ini dimulai dengan i = 1 dan diakhiri dengan i = localStorage.length? Di browser yang telah saya uji (Chrome), loop harus dimulai pada 0 dan berakhir di localStorage.length - 1 ...
Louis LC
@LouisLC karena saya menggunakan angka progresif untuk kunci saya (seperti kunci primer dalam basis data relasional).
Simone

Jawaban:

35

di ES2017 Anda dapat menggunakan:

Object.entries(localStorage)
nktshn
sumber
5
dan saya menganggap Object.keys()pekerjaan seperti yang diharapkan juga?
292
for (var key in localStorage){
   console.log(key)
}

EDIT: jawaban ini mendapatkan banyak upvotes, jadi saya kira itu adalah pertanyaan umum. Saya merasa seperti berhutang kepada siapa pun yang mungkin tersandung pada jawaban saya dan berpikir itu "benar" hanya karena diterima untuk membuat pembaruan. Sebenarnya, contoh di atas sebenarnya bukan cara yang tepat untuk melakukan ini. Cara terbaik dan teraman adalah melakukannya seperti ini:

for ( var i = 0, len = localStorage.length; i < len; ++i ) {
  console.log( localStorage.getItem( localStorage.key( i ) ) );
}
Kevin Ennis
sumber
Dalam tautan ini .... stackoverflow.com/questions/15313606/ ... ... mengapa mereka menggunakan semua metode aneh ini untuk mengakses localStorage?
2
Beberapa pertanyaan untuk kode "terbaik / teraman": 1) Mengapa menyatakan localStorage.lengthdan tidak menggunakannya secara langsung? 2) Mengapa mendeklarasikannya di dalam for loop? 3) Mengapa ++ilebih disukai daripada i++?
Luciano Bargmann
8
Apakah Anda benar-benar mencobanya? ++ipasti tidak membuat loop dimulai i = 1. Ekspresi ketiga di dalam kurung dievaluasi setelah setiap iterasi. i++dan ++ikeduanya memiliki efek yang sama persis pada i. Perbedaannya adalah bahwa ++imengevaluasi ke baru nilai isetelah incrementing, sedangkan i++mengevaluasi ke nilai i sebelum incrementing. Sama sekali tidak ada perbedaan di sini, karena yang kita pedulikan hanyalah efek samping dari penambahan i, bukan nilai ekspresi.
Kevin Ennis
33
Perlu dicatat bahwa saat ini Object.keys(localStorage)berfungsi dengan baik untuk skenario ini, selama Anda tidak perlu mendukung IE <9.
Adrian
2
Juga berguna untuk dicatat adalah bahwa jika Anda ingin menampilkan nama kunci itu sendiri, Anda dapat melakukannya dengan localStorage.key( i )bagian itu.
Sean Colombo
30

Saya suka membuat objek yang mudah terlihat keluar seperti ini.

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

Saya melakukan hal yang sama dengan cookie juga.

document.cookie.split(';').reduce(function(obj, str){ 
    var s = str.split('='); 
    obj[s[0].trim()] = s[1];
    return obj;
}, {});
Zack Argyle
sumber
1
Saya suka gaya iterasi pada objek.
Jonathan Stellwag
12
function listAllItems(){  
    for (i=0; i<=localStorage.length-1; i++)  
    {  
        key = localStorage.key(i);  
        alert(localStorage.getItem(key));
    }  
}
nerdcoder
sumber
9

Anda dapat menggunakan localStorage.key(index)fungsi untuk mengembalikan representasi string, di mana indexobjek ke-n yang ingin Anda ambil.

Jeffrey Sweeney
sumber
7

Jika browser mendukung HTML5 LocalStorage, browser juga harus mengimplementasikan Array.prototype.map, mengaktifkan ini:

Array.apply(0, new Array(localStorage.length)).map(function (o, i) {
    return localStorage.key(i);
})
cillay
sumber
Anda juga bisa melakukan new Array(this.localStorage.length).fill(0)yang terasa sedikit kurang hacky daripada menggunakan apply imo.
Lenny
6

Karena pertanyaan menyebutkan menemukan kunci, saya pikir saya akan menyebutkan bahwa untuk menunjukkan setiap pasangan kunci dan nilai, Anda bisa melakukannya seperti ini (berdasarkan jawaban Kevin):

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

Ini akan mencatat data dalam format "key: value"

(Kevin: jangan ragu untuk hanya mengambil info ini ke dalam jawaban Anda jika Anda mau!)

Sean Colombo
sumber
1

Ini akan mencetak semua kunci dan nilai pada Penyimpanan lokal:

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
sumber
1

Anda bisa mendapatkan kunci dan nilai seperti ini:

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

Saya setuju dengan Kevin ia memiliki jawaban terbaik tetapi kadang-kadang ketika Anda memiliki kunci berbeda di penyimpanan lokal Anda dengan nilai yang sama misalnya Anda ingin pengguna publik Anda melihat berapa kali mereka telah menambahkan barang-barang mereka ke keranjang mereka, Anda perlu menunjukkan kepada mereka beberapa kali juga maka Anda dapat menggunakan ini:

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
sumber
-1

Bagi mereka yang menyebutkan menggunakan Object.keys(localStorage)... jangan karena itu tidak akan bekerja di Firefox (ironisnya karena Firefox setia dengan spesifikasi). Pertimbangkan ini:

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

Karena key, getItem dan setItem adalah metode prototypal Object.keys(localStorage)hanya akan kembali ["key2"].

Anda sebaiknya melakukan sesuatu seperti ini:

let t = [];
for (let i = 0; i < localStorage.length; i++) {
  t.push(localStorage.key(i));
}
Mike Ratcliffe
sumber
@Arkrum Karena Firefox mengikuti spesifikasi dengan benar, kunci, getItem dan setItem akan hilang jika Anda menggunakan object.keys()... Saya akan memperbarui jawaban saya untuk mencerminkan itu.
Mike Ratcliffe
Baca saja spesifikasi untuk penyimpanan lokal dan saya tidak melihat apa yang Anda sebutkan.
Darkrum
Dan baca spec untuk object.keys () sepertinya Firefox yang tidak menimpanya jika apa yang Anda katakan itu benar.
Darkrum
@Darkrum Lihatlah html.spec.whatwg.org/multipage/… dan Anda dapat melihat bahwa specnya mendefinisikan IDL [Exposed=Window]. Ini menghasilkan perilaku yang saya jelaskan. Jika ditentukan dengan [Exposed=Window,OverrideBuiltins]itu akan memberikan perilaku yang kita harapkan tetapi spec tidak menentukan OverrideBuiltins. Anda dapat melihat diskusi tentang hal ini di whatwg / html di sini: github.com/whatwg/html/issues/183
Mike Ratcliffe
Sekali lagi karena saya akan menyatakan ini tidak ada hubungannya dengan cara kerja object.keys. Pilihan Mozillas untuk tidak membiarkan mereka diatur adalah bagaimana mereka menginterpretasikan spec. Jelas Google tahu apa yang dilakukannya karena apa prototipe yang tidak dapat diubah kecuali secara khusus dilakukan melalui cara lain ada hubungannya dengan properti sendiri.
Darkrum
-3

Kita juga bisa membaca namanya.

Katakanlah kita telah menyimpan nilai dengan nama 'pengguna' seperti ini

localStorage.setItem('user', user_Detail);

Lalu kita bisa membacanya dengan menggunakan

localStorage.getItem('user');

Saya menggunakannya dan berfungsi dengan baik, tidak perlu melakukan for loop

Ali Adravi
sumber