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

Ответы:

35

в ES2017 вы можете использовать:

Object.entries(localStorage)
nktshn
источник
5
и я полагаю, Object.keys()работает как ожидалось, а?
292
for (var key in localStorage){
   console.log(key)
}

РЕДАКТИРОВАТЬ: этот ответ получает много голосов, поэтому я думаю, что это общий вопрос. Я чувствую, что обязан всем тем, кто может наткнуться на мой ответ и подумать, что это «правильно» только потому, что было принято сделать обновление. Правда в том, что приведенный выше пример не совсем правильный способ сделать это. Самый лучший и безопасный способ сделать это так:

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));
    }  
}
nerdcoder
источник
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);
})
cillay
источник
Вы также можете сделать 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")

Поскольку key, getItem и setItem являются прототипными методами, они Object.keys(localStorage)будут только возвращаться ["key2"].

Лучше всего сделать что-то вроде этого:

let t = [];
for (let i = 0; i < localStorage.length; i++) {
  t.push(localStorage.key(i));
}
Майк Рэтклифф
источник
@Darkrum Поскольку Firefox правильно следует спецификации, key, 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/issues/183
Майк Рэтклифф,
Опять же, как я утверждаю, это не имеет никакого отношения к тому, как работает object.keys. Выбор Mozillas, чтобы не позволить им быть установленным, - то, как они интерпретировали спецификацию. Ясно, что Google знал, что делает, потому что то, что делает прототип, который нельзя изменить, если это специально не сделано другими способами, имеет какое-то отношение к собственным свойствам.
Darkrum
-3

Мы также можем прочитать по имени.

Скажем, мы сохранили значение с именем «пользователь», как это

localStorage.setItem('user', user_Detail);

Тогда мы можем прочитать это с помощью

localStorage.getItem('user');

Я использовал его, и он работает гладко, не нужно делать цикл for

Али Адрави
источник