Цикл через localStorage в HTML5 и JavaScript

95

Итак, я подумал, что могу просто пройти через 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работает.

Оскар Годсон
источник

Ответы:

146

Вы можете воспользоваться 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? Мол, как добавить "привет" после "Долор"?
Oscar Godson
1
ты качаешься, просто глядя, должно работать. Есть ли причина, по которой я должен использовать синтаксический анализ, а не eval? Сейчас я использую eval, чтобы получить его из строки, но лучше / быстрее разбирается?
Oscar Godson
1
@Oscar parseболее безопасен, потому что защищает вас от выполнения кода. И часто это намного быстрее. См. Blog.mozilla.com/webdev/2009/02/12/native-json-in-firefox-31
Мэтью
1
@BBagi, он возвращает декодированный вход. Верхний уровень текста JSON может быть объектом или массивом. ПопробуйтеJSON.parse('["Lorem", "Ipsum", "Dolor"]').length
Мэтью Флашен
34

Самый простой способ:

Object.keys(localStorage).forEach(function(key){
   console.log(localStorage.getItem(key));
});
Putra Ardiansyah
источник
24

В дополнение ко всем другим ответам вы можете использовать функцию $ .each из библиотеки jQuery:

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

  // key magic
  // value magic

});

В конце концов, получите объект с:

JSON .parse (localStorage.getItem (localStorage.key (ключ)));

миксиии
источник
2
Это работает, только если вы используете jQuery. $используется для других библиотек, а также часто используется как псевдоним для document.querySelectorAll. Вопрос также не помечен как вопрос [jquery].
AnnanFay 06
9

Это работает для меня в Chrome:

for(var key in localStorage) {
  $('body').append(localStorage.getItem(key));
}
jtblin
источник
1
Какая именно часть? Этот фрагмент использует jQuery в соответствии с исходным вопросом. Можете ли вы попробовать это в консоли Chrome js? for(var key in localStorage) { console.log(localStorage.getItem(key)); }
jtblin
@jtblin Я только что попробовал, он вернулся TypeError: Cannot call method 'toString' of null, поэтому я предполагаю, что 'key' возвращает null
Хуан Карлос Альпизар Шиншилла
1
Это работает в последних версиях Chrome, Safari и Firefox
mndrix,
1
@JuanCarlosAlpizarChinchilla, в коде нет toString, поэтому ¯_ (ツ) _ / ¯. Как указано в комментарии выше, отлично работает во всех последних браузерах.
jtblin
@jtblin моему комментарию два года, так что ¯_ (ツ) _ / ¯, тем не менее, спасибо за внимание
Хуан Карлос Альпизар Шиншилла
1

Основываясь на предыдущем ответе, здесь представлена ​​функция, которая будет проходить через локальное хранилище по ключу, не зная значений ключей.

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

Если вы изучите вывод консоли, вы увидите, что все элементы, добавленные вашим кодом, имеют строку typeof. В то время как встроенные элементы являются либо функциями {[собственный код]}, либо, в случае свойства length, числом. Вы можете использовать переменную typeofKey для фильтрации только по строкам, чтобы отображались только ваши элементы.

Обратите внимание, что это работает, даже если вы сохраняете число или логическое значение в качестве значения, поскольку они оба хранятся в виде строк.

Стив Изенберг
источник
1

Все эти ответы игнорируют различия между реализациями localStorage в разных браузерах. Авторы в этой области должны тщательно согласовывать свои ответы с платформами, которые они описывают. Одна реализация для всего браузера задокументирована по адресу https://developer.mozilla.org/en/docs/Web/API/Window/localStorage и, будучи очень мощной, содержит только несколько основных методов. Цикл по содержанию требует понимания реализации, специфичной для отдельных браузеров.

StarTraX
источник
Не могли бы вы привести пример того, как один из этих ответов не работает в браузере? Это было давно, но я не помню, чтобы у меня возникали какие-либо проблемы с прохождением этих ответов
Оскар Годсон
Я намеревался добавить свой комментарий в общий поток, а не в этот конкретный пост, и, возможно, он был немного резким. В то время я был разочарован, пытаясь найти кросс-браузерное решение. Пример Стива Изенберга (ниже), содержащий for (var key в localStorage) {typeofKey = (typeof localStorage [key]); console.log (ключ, typeofKey); } Не работает с реализациями webKit (попробуйте!)
StarTraX,
Это действительно работает: for (var i = 0; i <localStorage.length; ++ i) {console.log (localStorage.key (i) + ":" + localStorage.getItem (localStorage.key (i))); }
StarTraX
1

localStorageэто Object.

Мы можем пройти через него с помощью JavaScript for / in Statement, как и любой другой Object.

И мы будем использовать .getItem()для доступа к значению каждого ключа (x).

for (x in localStorage){
    console.log(localStorage.getItem(x));
}
Шаян
источник