วนลูปผ่าน localStorage ใน HTML5 และ JavaScript


98

ดังนั้นฉันคิดว่าฉันสามารถวนลูป localStorage ได้เหมือนวัตถุทั่วไปเพราะมันมีความยาว ฉันจะวนซ้ำสิ่งนี้ได้อย่างไร

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

ถ้าฉันทำlocalStorage.lengthมันจะส่งคืน3ซึ่งถูกต้อง ฉันคิดว่าการfor...inวนซ้ำจะใช้ได้ผล

ฉันกำลังคิดบางอย่างเช่น:

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

แต่ไม่มีประโยชน์ ความคิดใด ๆ ?

ความคิดอื่น ๆ ที่ฉันมีก็คือ

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

ซึ่งในการfor...inทำงาน


ดูเพิ่มเติม : รับHTML5 localStorage keys
KyleMit

คำตอบ:


149

คุณสามารถใช้keyวิธี localStorage.key(index)ส่งคืนindexคีย์ th (คำสั่งถูกกำหนดให้ใช้งาน แต่คงที่จนกว่าคุณจะเพิ่มหรือลบคีย์)

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

หากคำสั่งซื้อมีความสำคัญคุณสามารถจัดเก็บอาร์เรย์แบบอนุกรม JSON:

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

ข้อมูลจำเพาะแบบร่างอ้างว่าออบเจ็กต์ใด ๆ ที่รองรับการโคลนที่มีโครงสร้างสามารถเป็นค่าได้ แต่ดูเหมือนจะยังไม่รองรับ

แก้ไข: ในการโหลดอาร์เรย์ให้เพิ่มเข้าไปแล้วจัดเก็บ:

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

ขอบคุณมาก! นี่เป็นเพียงสิ่งที่ฉันกำลังมองหา ฉันจะตรวจสอบสิ่ง JSON ที่คุณส่งด้วย นั่นจะสมบูรณ์แบบ สำหรับแอป Baby Names Offline HTML5 iOS
Oscar Godson

คำถามด่วนฉันจะเพิ่ม JSON นั้นได้อย่างไร เช่นฉันจะเพิ่ม "สวัสดี" หลัง "Dolor" ได้อย่างไร
Oscar Godson

1
คุณร็อคแค่มองก็น่าจะใช้ได้ มีเหตุผลที่ฉันควรใช้การแยกวิเคราะห์และไม่ประเมินหรือไม่? ตอนนี้ฉันใช้ eval เพื่อรับจากสตริง แต่แยกวิเคราะห์ได้ดีกว่า / เร็วกว่าหรือไม่
Oscar Godson

1
@Oscar parseปลอดภัยกว่าเพราะปกป้องคุณจากการเรียกใช้โค้ด และบ่อยครั้งมันเร็วกว่ามากด้วย ดูblog.mozilla.com/webdev/2009/02/12/native-json-in-firefox-31
Matthew Flaschen

1
@BBagi จะส่งคืนสิ่งที่อินพุตเป็นถอดรหัส ระดับบนสุดของข้อความ JSON อาจเป็นวัตถุหรืออาร์เรย์ ลองJSON.parse('["Lorem", "Ipsum", "Dolor"]').length
Matthew Flaschen


25

นอกเหนือจากคำตอบอื่น ๆ ทั้งหมดคุณสามารถใช้ฟังก์ชัน$ .eachจากไลบรารี jQuery:

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

  // key magic
  // value magic

});

ในที่สุดรับวัตถุด้วย:

JSON .parse (localStorage.getItem (localStorage.key (คีย์)));


2
สิ่งนี้ใช้ได้เฉพาะเมื่อคุณใช้ jQuery $ถูกนำมาใช้สำหรับห้องสมุดอื่น ๆ document.querySelectorAllและก็มักจะใช้เป็นชื่อแทนสำหรับ คำถามยังไม่ถูกแท็กเป็นคำถาม [jquery]
AnnanFay

9

สิ่งนี้ใช้ได้กับฉันใน Chrome:

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

1
ตรงส่วนไหนกันแน่? ตัวอย่างข้อมูลนี้ใช้ jQuery ตามคำถามเดิม ลองใช้ chrome js console ได้ไหมครับ for(var key in localStorage) { console.log(localStorage.getItem(key)); }
jtblin

@jtblin ฉันเพิ่งลองมันกลับมาTypeError: Cannot call method 'toString' of nullดังนั้นฉันถือว่า 'คีย์' กำลังส่งคืนค่าว่าง
Juan Carlos Alpizar Chinchilla

1
สิ่งนี้ใช้ได้กับ Chrome, Safari และ Firefox เวอร์ชันล่าสุด
mndrix

1
@JuanCarlosAlpizarChinchilla ไม่มี 'toString' ในรหัสดังนั้น¯_ (ツ) _ / ¯ ตามที่ระบุไว้ในความคิดเห็นด้านบนใช้งานได้ดีในเบราว์เซอร์ล่าสุดทั้งหมด
jtblin

@jtblin ความคิดเห็นของฉันอายุสองขวบดังนั้น¯_ (ツ) _ / ¯ขอบคุณสำหรับหัวขึ้นแม้ว่า
Juan Carlos Alpizar Chinchilla

1

การสร้างคำตอบก่อนหน้านี้คือฟังก์ชั่นที่จะวนลูปผ่านที่เก็บข้อมูลในเครื่องโดยใช้คีย์โดยไม่ทราบค่าคีย์

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

หากคุณตรวจสอบเอาต์พุตคอนโซลคุณจะเห็นรายการที่เพิ่มโดยโค้ดของคุณทั้งหมดมีสตริง typeof ในขณะที่รายการในตัวเป็นฟังก์ชัน {[โค้ดเนทีฟ]} หรือในกรณีของคุณสมบัติ length a number คุณสามารถใช้ตัวแปร typeofKey เพื่อกรองเฉพาะสตริงเพื่อให้แสดงเฉพาะรายการของคุณ

โปรดทราบว่าสิ่งนี้ใช้ได้แม้ว่าคุณจะเก็บตัวเลขหรือบูลีนไว้เป็นค่าเนื่องจากทั้งสองจะถูกเก็บไว้เป็นสตริง


1

คำตอบทั้งหมดนี้ไม่สนใจความแตกต่างระหว่างการใช้งาน localStorage ในเบราว์เซอร์ ผู้ร่วมให้ข้อมูลในโดเมนนี้ควรมีคุณสมบัติในการตอบสนองอย่างมากกับแพลตฟอร์มที่พวกเขาอธิบาย การใช้งานทั่วทั้งเบราว์เซอร์หนึ่งรายการได้รับการบันทึกไว้ที่ https://developer.mozilla.org/en/docs/Web/API/Window/localStorageและในขณะที่ทรงพลังมากมีเพียงวิธีการหลักบางอย่างเท่านั้น การวนซ้ำเนื้อหาจำเป็นต้องมีความเข้าใจในการนำไปใช้งานเฉพาะกับเบราว์เซอร์แต่ละตัว


คุณช่วยยกตัวอย่างได้ไหมว่าหนึ่งในคำตอบเหล่านี้ใช้ไม่ได้กับเบราว์เซอร์ นี่เป็นเวลานานแล้ว แต่ฉันจำไม่ได้ว่าพบปัญหาใด ๆ กับการวนซ้ำกับคำตอบเหล่านี้
Oscar Godson

ฉันตั้งใจให้ความคิดเห็นของฉันถูกเพิ่มในสตรีมโดยรวมไม่ใช่โพสต์นี้โดยเฉพาะและอาจรุนแรงไปหน่อย ฉันรู้สึกท้อแท้ในขณะที่พยายามหาวิธีแก้ปัญหาข้ามเบราว์เซอร์ ตัวอย่างโดย Steve Isenberg (ด้านล่าง) ที่มีสำหรับ (var key ใน localStorage) {typeofKey = (typeof localStorage [key]); console.log (คีย์ typeofKey); } ใช้งานไม่ได้กับการใช้งาน webKit (ลองดูสิ!)
StarTraX

ใช้งานได้: สำหรับ (var i = 0; i <localStorage.length; ++ i) {console.log (localStorage.key (i) + ":" + localStorage.getItem (localStorage.key (i))); }
StarTraX

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.