Отримайте локальні ключі зберігання HTML5


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, оскільки я використовував прогресивні числа для своїх ключів (як первинний ключ у реляційній базі даних).
Симоне

Відповіді:


35

у ES2017 ви можете використовувати:

Object.entries(localStorage)

5
і я припускаю, що Object.keys()роботи також очікуються?

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

EDIT: ця відповідь отримує багато відгуків, тому я думаю, що це поширене питання. Я відчуваю, що завдячую тому, хто може спіткнутися на мою відповідь і вважає, що це "правильно" лише тому, що було прийнято робити оновлення. Правда, наведений вище приклад насправді не є правильним способом зробити це. Найкращий і безпечний спосіб - це зробити так:

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) Навіщо оголошувати це всередині циклу for? 3) Чому ++iвіддається перевага над i++?
Лучано Баргманн

8
Ви насправді спробували? ++iнапевно, це не робить цикл починати i = 1. Третє вираження всередині дужок оцінюється після кожної ітерації. i++і ++iобидва мають однаковий вплив на i. Різниця полягає в тому, що ++iоцінюється нове значення iпісля збільшення, тоді як i++оцінюється до значення i до збільшення. Тут абсолютно немає різниці, адже все, що нас хвилює, - це побічний ефект збільшення i, а не значення виразу.
Кевін Енніс

33
Варто відзначити, що нині Object.keys(localStorage)ідеально підходить цей сценарій, доки вам не потрібно підтримувати IE <9.
Адріан

2
Також корисно зазначити, що якщо ви хочете відобразити назву самого ключа, ви можете зробити це з localStorage.key( i )частиною.
Шон Коломбо

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
Мені подобається такий стиль ітерації над об’єктами.
Джонатан Стеллуг

12
function listAllItems(){  
    for (i=0; i<=localStorage.length-1; i++)  
    {  
        key = localStorage.key(i);  
        alert(localStorage.getItem(key));
    }  
}

9

Ви можете використовувати localStorage.key(index)функцію для повернення рядкового представлення, де indexзнаходиться n-й об'єкт, який ви хочете отримати.


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)що відчуває себе трохи менше хакі, ніж використовувати Apply imo.
Ленні

6

Оскільки в запитанні було вказано пошук ключів, я подумав, що хочу зазначити, що для показу кожної пари ключів і значень можна зробити це так (на основі відповіді Кевіна):

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

При цьому будуть записані дані у форматі "ключ: значення"

(Кевін: сміливо введіть цю інформацію у свою відповідь, якщо хочете!)


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

Я згоден з Кевіном, він має найкращу відповідь, але іноді, коли у вашому локальному сховищі є різні ключі з однаковими значеннями, наприклад, ви хочете, щоб ваші загальнодоступні користувачі бачили, скільки разів вони додавали свої предмети у свої кошики, вам потрібно показати їм кількість разів, то ви можете використовувати це:

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()... Я оновлю свою відповідь, щоб це відобразити.
Майк Раткліфф

Просто прочитайте специфікацію для місцевого зберігання, і я не бачу, що ви згадали.
Darkrum

І прочитайте специфікацію для object.keys (), схоже, Firefox - це те, що не перебуває, якщо те, що ви говорите, є істинним.
Darkrum

@Darkrum Подивіться на html.spec.whatwg.org/multipage/…, і ви можете побачити, що специфікація визначає IDL за допомогою [Exposed=Window]. Це призводить до поведінки, яку я описую. Якби це було визначено, [Exposed=Window,OverrideBuiltins]це призведе до поведінки, яку ми очікуємо, але специфікація не визначає OverrideBuiltins. Ви можете побачити дискусію про це у whatwg / html тут: github.com/whatwg/html/isissue/183
Майк Раткліфф

Знову, як я зазначу, це не має нічого спільного з тим, як працює object.keys. Вибір Mozillas не дозволяти їх встановлювати - це те, як вони інтерпретували специфікацію. Ясно, що Google знав, що робить, тому що те, що робить прототип, який неможливо змінити, якщо спеціально це не зроблено за допомогою інших засобів, не має нічого спільного з власними властивостями.
Darkrum

-3

Ми також можемо читати по імені.

Скажімо, ми зберегли значення з таким ім'ям "user"

localStorage.setItem('user', user_Detail);

Тоді ми можемо прочитати це за допомогою

localStorage.getItem('user');

Я використовував це, і він працює гладко, не потрібно робити цикл

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.