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.


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));

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));
});

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)));


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));
}

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.


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.


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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.