รับคีย์ HTML5 localStorage


145

ฉันแค่สงสัยว่าจะรับค่าคีย์ทั้งหมดได้localStorageอย่างไร


ฉันพยายามดึงค่าด้วยการวนซ้ำ JavaScript อย่างง่าย

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

แต่ใช้งานได้เฉพาะเมื่อคีย์เป็นตัวเลขโปรเกรสซีฟเริ่มต้นที่ 1


ฉันจะรับกุญแจทั้งหมดได้อย่างไรเพื่อแสดงข้อมูลที่มีทั้งหมด



สำเนาซ้ำซ้อนของstackoverflow.com/questions/3138564/…
kubetz

ทำไมลูปนี้เริ่มต้นด้วย i = 1 และลงท้ายด้วย i = localStorage.length ในเบราว์เซอร์ที่ฉันได้ทดสอบ (Chrome) ลูปควรเริ่มต้นที่ 0 และสิ้นสุดที่ localStorage.length - 1 ...
Louis LC

@ LouisLC เพราะฉันใช้หมายเลขโปรเกรสซีฟสำหรับคีย์ของฉัน (เช่นคีย์หลักในฐานข้อมูลเชิงสัมพันธ์)
Simone

คำตอบ:


35

ใน ES2017 คุณสามารถใช้:

Object.entries(localStorage)

5
และฉันคิดว่าObject.keys()ทำงานได้ตามที่คาดหวังเช่นกัน?

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

แก้ไข: คำตอบนี้ได้รับ upvotes มากมายดังนั้นฉันเดาว่ามันเป็นคำถามทั่วไป ฉันรู้สึกเหมือนฉันเป็นหนี้กับทุกคนที่อาจสะดุดกับคำตอบของฉันและคิดว่ามัน "ถูกต้อง" เพียงเพราะได้รับการยอมรับให้ทำการอัปเดต ความจริงคือตัวอย่างข้างต้นไม่ใช่วิธีที่ถูกต้องในการทำสิ่งนี้ วิธีที่ดีที่สุดและปลอดภัยที่สุดคือทำอย่างนี้:

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

ในลิงค์นี้ .... stackoverflow.com/questions/15313606/… ... ทำไมพวกเขาถึงใช้วิธีแปลก ๆ เหล่านี้เพื่อเข้าถึง localStorage

2
คำถามหลายข้อสำหรับรหัส "ดีที่สุด / ปลอดภัยที่สุด": 1) ทำไมต้องประกาศlocalStorage.lengthและไม่ใช้โดยตรง 2) ทำไมต้องประกาศภายในวง 3) ทำไมถึง++iชอบมากกว่าi++?
Luciano Bargmann

8
คุณลองมันจริงหรือ ++iแน่นอนที่สุดไม่ได้i = 1ทำให้การเริ่มต้นวงที่ นิพจน์ที่สามภายในวงเล็บถูกประเมินหลังจากการวนซ้ำแต่ละครั้ง i++และทั้งสองมีผลเช่นเดียวกันแน่นอน++i iความแตกต่างคือ++iประเมินค่าใหม่iหลังจากเพิ่มขึ้นในขณะที่i++ประเมินเป็นมูลค่าi ก่อนเพิ่มขึ้น มันทำให้ไม่มีความแตกต่างอย่างแน่นอนที่นี่เพราะสิ่งที่เราใส่ใจคือผลข้างเคียงของการเพิ่มขึ้นiไม่ใช่คุณค่าของการแสดงออก
เควินเอนนิส

33
เป็นที่น่าสังเกตว่าทุกวันนี้Object.keys(localStorage)ทำงานได้อย่างสมบูรณ์แบบสำหรับสถานการณ์นี้ตราบใดที่คุณไม่จำเป็นต้องรองรับ IE <9
Adrian

2
ยังมีประโยชน์ที่จะต้องทราบก็คือถ้าคุณต้องการแสดงชื่อของคีย์เองคุณสามารถทำได้ด้วยlocalStorage.key( i )ส่วน
Sean Colombo

30

ฉันชอบที่จะสร้างวัตถุที่มองเห็นได้ง่ายจากสิ่งนี้

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

ฉันทำสิ่งที่คล้ายกับคุกกี้เช่นกัน

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

1
ฉันชอบสไตล์ของการวนซ้ำวัตถุ
Jonathan Stellwag



7

หากเบราว์เซอร์รองรับ HTML5 LocalStorage ก็ควรใช้ Array.prototype.map ด้วยเช่นกัน:

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

นอกจากนี้คุณยังสามารถทำสิ่งnew Array(this.localStorage.length).fill(0)ที่รู้สึกแฮ็กน้อยกว่าการใช้ imo
Lenny

6

เนื่องจากคำถามที่กล่าวถึงการค้นหากุญแจฉันคิดว่าฉันจะพูดถึงการแสดงคู่คีย์และค่าทุกคู่คุณสามารถทำสิ่งนี้ได้ (ตามคำตอบของ Kevin):

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

สิ่งนี้จะบันทึกข้อมูลในรูปแบบ "key: value"

(Kevin: อย่าลังเลที่จะนำข้อมูลนี้ไปใช้ในคำตอบของคุณหากคุณต้องการ!)


1

นี่จะพิมพ์คีย์และค่าทั้งหมดบน localStorage:

ES6:

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

1

คุณสามารถรับกุญแจและค่าเช่นนี้:

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

0

ฉันเห็นด้วยกับ Kevin เขามีคำตอบที่ดีที่สุด แต่บางครั้งเมื่อคุณมีคีย์ที่แตกต่างกันในที่จัดเก็บในท้องที่ของคุณด้วยค่าเดียวกันเช่นคุณต้องการให้ผู้ใช้สาธารณะของคุณเห็นจำนวนครั้งที่พวกเขาได้เพิ่มรายการลงในตะกร้าของคุณ จำนวนครั้งเช่นกันคุณสามารถใช้สิ่งนี้:

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 (แดกดันเพราะ Firefox ซื่อสัตย์ต่อสเป็ค) พิจารณาสิ่งนี้:

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

เนื่องจากคีย์ getItem และ setItem เป็นวิธีการสร้างต้นแบบObject.keys(localStorage)จะส่งคืนเท่านั้น["key2"]จะกลับมา

คุณดีที่สุดที่จะทำสิ่งนี้:

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

@Darkrum เนื่องจาก Firefox ปฏิบัติตามข้อกำหนดอย่างถูกต้องพิมพ์คีย์ getItem และ setItem จะหายไปหากคุณใช้object.keys()... ฉันจะอัปเดตคำตอบเพื่อให้สะท้อนถึงสิ่งนั้น
Mike Ratcliffe

เพียงแค่อ่านข้อมูลจำเพาะสำหรับการจัดเก็บในพื้นที่และฉันไม่เห็นสิ่งที่คุณพูดถึง
Darkrum

และอ่านข้อมูลจำเพาะสำหรับ object.keys () ดูเหมือนว่า Firefox คือสิ่งที่ไม่ตกหล่นถ้าสิ่งที่คุณพูดเป็นเรื่องจริง
Darkrum

ดู @Darkrum ที่html.spec.whatwg.org/multipage/...และคุณสามารถเห็นได้ว่าข้อมูลจำเพาะกำหนด IDL [Exposed=Window]กับ สิ่งนี้ส่งผลในพฤติกรรมที่ฉันอธิบาย ถ้ามันถูกระบุด้วย[Exposed=Window,OverrideBuiltins]มันจะทำให้พฤติกรรมที่เราคาดหวัง แต่สเปคไม่ได้OverrideBuiltinsระบุ คุณสามารถดูการสนทนาเกี่ยวกับเรื่องนี้ใน whatwg / html ที่นี่: github.com/whatwg/html/issues/183
Mike Ratcliffe

อีกครั้งที่ฉันจะระบุว่าสิ่งนี้ไม่เกี่ยวข้องกับการทำงานของ object.keys ทางเลือกของโมซิลล่าที่จะไม่อนุญาตให้พวกเขาตั้งค่าเป็นวิธีที่พวกเขาตีความข้อมูลจำเพาะ เห็นได้ชัดว่า Google รู้ว่ามันกำลังทำอะไรอยู่เพราะต้นแบบที่ไม่สามารถเปลี่ยนแปลงได้เว้นแต่จะทำโดยวิธีอื่นโดยเฉพาะมีอะไรเกี่ยวข้องกับคุณสมบัติของตัวเอง
Darkrum

-3

นอกจากนี้เรายังสามารถอ่านชื่อ

สมมติว่าเราได้บันทึกค่าด้วยชื่อ 'ผู้ใช้' เช่นนี้

localStorage.setItem('user', user_Detail);

จากนั้นเราสามารถอ่านได้โดยใช้

localStorage.getItem('user');

ฉันใช้มันและมันทำงานได้อย่างราบรื่นไม่จำเป็นต้องทำเพื่อลูป

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