Loop por meio de localStorage em HTML5 e JavaScript

92

Então, eu estava pensando que poderia simplesmente percorrer localStorage como um objeto normal, pois tem um comprimento. Como posso fazer um loop por isso?

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

Se eu fizer um, localStorage.lengthele retorna o 3que está correto. Então, eu presumo que um for...inloop funcione.

Eu estava pensando algo como:

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

Mas não adiantou. Alguma ideia?

A outra ideia que tive foi algo como

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

Em que for...infunciona.

Oscar Godson
fonte
Veja também : Obter chaves HTML5 localStorage
KyleMit

Respostas:

143

Você pode usar o keymétodo. localStorage.key(index)retorna a indexenésima chave (a ordem é definida pela implementação, mas constante até que você adicione ou remova chaves).

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

Se o pedido for importante, você pode armazenar uma matriz serializada JSON:

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

O rascunho das especificações afirma que qualquer objeto que suporte clone estruturado pode ser um valor. Mas isso ainda não parece ser compatível.

EDITAR: Para carregar a matriz, adicione a ela e armazene:

var words = JSON.parse(localStorage.getItem("words"));
words.push("hello");
localStorage.setItem("words", JSON.stringify(words));
Matthew Flaschen
fonte
Muito obrigado! Isso é exatamente o que eu estava procurando. Também vou analisar o JSON que você enviou. Isso seria perfeito. É para um aplicativo iOS HTML5 offline do Baby Names.
Oscar Godson
Pergunta rápida, como eu adicionaria a esse JSON? Tipo, como eu adicionaria "olá" após "Dolor"?
Oscar Godson
1
você balança, só de olhar, deve funcionar. Existe um motivo pelo qual devo usar parse e não eval? Estou usando eval agora para obtê-lo de uma string, mas analisar melhor / mais rápido?
Oscar Godson
1
@Oscar, parseé mais seguro porque protege você da execução de código. E frequentemente, também é muito mais rápido. Consulte blog.mozilla.com/webdev/2009/02/12/native-json-in-firefox-31
Matthew Flaschen
1
@BBagi, ele retorna qualquer que seja a entrada, decodificada. O nível superior de um texto JSON pode ser um objeto ou matriz. TenteJSON.parse('["Lorem", "Ipsum", "Dolor"]').length
Matthew Flaschen
32

A maneira mais simples é:

Object.keys(localStorage).forEach(function(key){
   console.log(localStorage.getItem(key));
});
Putra Ardiansyah
fonte
24

Além de todas as outras respostas, você pode usar a função $ .each da biblioteca jQuery:

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

  // key magic
  // value magic

});

Eventualmente, obtenha o objeto com:

JSON .parse (localStorage.getItem (localStorage.key (key)));

miksiii
fonte
2
Isso só funciona se você estiver usando jQuery. $é usado para outras bibliotecas e também é frequentemente usado como um alias para document.querySelectorAll. A pergunta também não é marcada como uma pergunta [jquery].
AnnanFay
9

Isso funciona para mim no Chrome:

for(var key in localStorage) {
  $('body').append(localStorage.getItem(key));
}
jtblin
fonte
1
Qual parte exatamente? Este trecho usa jQuery de acordo com a pergunta original. Você pode tentar isso no console do Chrome js? for(var key in localStorage) { console.log(localStorage.getItem(key)); }
jtblin
@jtblin Acabei de experimentar, ele retornou TypeError: Cannot call method 'toString' of null, então presumo que 'key' está retornando null
Juan Carlos Alpizar Chinchilla
1
Isso funciona nas versões recentes do Chrome, Safari e Firefox
mndrix
1
@JuanCarlosAlpizarChinchilla não há 'toString' no código, então ¯_ (ツ) _ / ¯. Conforme apontado no comentário acima, funciona bem em todos os navegadores recentes.
jtblin de
@jtblin meu comentário tem dois anos, então ¯_ (ツ) _ / ¯ obrigado pela cabeça levantada
Juan Carlos Alpizar Chinchilla
1

Com base na resposta anterior, aqui está uma função que percorrerá o armazenamento local por chave, sem conhecer os valores da chave.

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

Se você examinar a saída do console, verá que todos os itens adicionados pelo seu código têm uma string typeof. Considerando que os itens embutidos são funções {[código nativo]} ou, no caso da propriedade de comprimento, um número. Você pode usar a variável typeofKey para filtrar apenas nas strings, de forma que apenas seus itens sejam exibidos.

Observe que isso funciona mesmo se você armazenar um número ou booleano como o valor, pois ambos são armazenados como strings.

Steve Isenberg
fonte
1

Todas essas respostas ignoram as diferenças entre as implementações de localStorage nos navegadores. Os contribuidores neste domínio devem qualificar fortemente suas respostas com as plataformas que estão descrevendo. Uma implementação em todo o navegador está documentada em https://developer.mozilla.org/en/docs/Web/API/Window/localStorage e, embora muito poderoso, contém apenas alguns métodos principais. O loop através do conteúdo requer uma compreensão da implementação específica para navegadores individuais.

StarTraX
fonte
Você poderia dar um exemplo de como uma dessas respostas não funcionaria em um navegador? Isso foi há muito tempo, mas não me lembro de ter tido problemas com essas respostas
Oscar Godson
Eu pretendia que meu comentário fosse adicionado ao fluxo geral, não a esta postagem em particular, e pode ter sido um pouco duro. Fiquei frustrado na hora de tentar encontrar uma solução para vários navegadores. O exemplo de Steve Isenberg (abaixo) contendo for (var key in localStorage) {typeofKey = (typeof localStorage [key]); console.log (chave, typeofKey); } Não funciona em implementações de webKit (experimente!)
StarTraX
Isso funciona: para (var i = 0; i <localStorage.length; ++ i) {console.log (localStorage.key (i) + ":" + localStorage.getItem (localStorage.key (i))); }
StarTraX