Obter chaves localStorage HTML5

145

Eu só estou querendo saber como obter todos os valores-chave localStorage.


Eu tentei recuperar os valores com um loop JavaScript simples

for (var i=1; i <= localStorage.length; i++)  {
   alert(localStorage.getItem(i))
}

Mas funciona apenas se as teclas forem números progressivos, iniciando em 1.


Como obtenho todas as chaves para exibir todos os dados disponíveis?

Simone
fonte
possível duplicação de stackoverflow.com/questions/3138564/…
kubetz
Por que esse loop começa com i = 1 e termina com i = localStorage.length? Nos navegadores que testei (Chrome), o loop deve começar em 0 e terminar em localStorage.length - 1 ...
Louis LC
@LouisLC porque eu estava usando números progressivos para minhas chaves (como uma chave primária em um banco de dados relacional).
Simone

Respostas:

35

no ES2017 você pode usar:

Object.entries(localStorage)
nktshn
fonte
5
e suponho que Object.keys()funciona como esperado também?
292
for (var key in localStorage){
   console.log(key)
}

EDIT: esta resposta está recebendo muitos votos positivos, então eu acho que é uma pergunta comum. Sinto que devo isso a qualquer um que possa tropeçar na minha resposta e achar que está "certo" só porque foi aceito para fazer uma atualização. A verdade é que o exemplo acima não é realmente o caminho certo para fazer isso. A maneira melhor e mais segura é fazer assim:

for ( var i = 0, len = localStorage.length; i < len; ++i ) {
  console.log( localStorage.getItem( localStorage.key( i ) ) );
}
Kevin Ennis
fonte
Neste link .... stackoverflow.com/questions/15313606/… ... por que eles estão usando todos esses métodos estranhos para acessar o localStorage?
2
Várias perguntas para o código "melhor / mais seguro": 1) Por que declarar localStorage.lengthe não usá-lo diretamente? 2) Por que declará-lo dentro do loop for? 3) Por que ++ipreferir i++?
Luciano Bargmann 31/08
8
Você realmente tentou? ++idefinitivamente , não inicia o ciclo às i = 1. A terceira expressão entre parênteses é avaliada após cada iteração. i++e ++iambos têm exatamente o mesmo efeito i. A diferença é que ++iavalia o novo valor de iapós incrementar, enquanto que i++avalia o valor de i antes de incrementar. Não faz absolutamente nenhuma diferença aqui, porque tudo o que importa é o efeito colateral do incremento i, não o valor da expressão.
Kevin Ennis
33
É interessante notar que hoje em dia Object.keys(localStorage)funciona perfeitamente bem para este cenário, desde que você não precisa para apoiar IE <9.
Adrian
2
Também é útil notar que, se você quiser exibir o nome da chave, poderá fazê-lo com a localStorage.key( i )peça.
Sean Colombo
30

Eu gosto de criar um objeto facilmente visível a partir dele assim.

Object.keys(localStorage).reduce(function(obj, str) { 
    obj[str] = localStorage.getItem(str); 
    return obj
}, {});

Eu faço uma coisa semelhante com os cookies também.

document.cookie.split(';').reduce(function(obj, str){ 
    var s = str.split('='); 
    obj[s[0].trim()] = s[1];
    return obj;
}, {});
Zack Argyle
fonte
1
Eu gosto desse estilo de iterar sobre objetos.
Jonathan Stellwag
12
function listAllItems(){  
    for (i=0; i<=localStorage.length-1; i++)  
    {  
        key = localStorage.key(i);  
        alert(localStorage.getItem(key));
    }  
}
nerdcoder
fonte
9

Você pode usar a localStorage.key(index)função para retornar a representação em cadeia, onde indexé o enésimo objeto que você deseja recuperar.

Jeffrey Sweeney
fonte
7

Se o navegador suportar HTML5 LocalStorage, ele também deve implementar Array.prototype.map, permitindo o seguinte:

Array.apply(0, new Array(localStorage.length)).map(function (o, i) {
    return localStorage.key(i);
})
cillay
fonte
Você também pode fazer o new Array(this.localStorage.length).fill(0)que parece um pouco menos invasivo do que usar o aplicativo imo.
Lenny
6

Desde que a pergunta mencionou encontrar as chaves, achei que mencionaria que, para mostrar todos os pares de chaves e valores, você poderia fazer assim (com base na resposta de Kevin):

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

Isso registrará os dados no formato "chave: valor"

(Kevin: fique à vontade para apenas levar essa informação à sua resposta, se quiser!)

Sean Colombo
fonte
1

Isso imprimirá todas as chaves e valores no localStorage:

ES6:

for (let i=0; i< localStorage.length; i++) {
    let key = localStorage.key(i);
    let value = localStorage[key];
    console.log(`localStorage ${key}:  ${value}`);
}
Rahim Naik
fonte
1

Você pode obter chaves e valores como este:

for (let [key, value] of Object.entries(localStorage)) {
  console.log(`${key}: ${value}`);
}
Admir
fonte
0

Concordo com Kevin, ele tem a melhor resposta, mas às vezes quando você tem chaves diferentes em seu armazenamento local com os mesmos valores, por exemplo, você deseja que seus usuários públicos vejam quantas vezes eles adicionaram seus itens em suas cestas, você precisa mostrar a eles número de vezes, então você pode usar isto:

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;
}
Hassan Azimi
fonte
-1

Para aqueles que mencionam o uso Object.keys(localStorage)... não, porque não funcionará no Firefox (ironicamente porque o Firefox é fiel às especificações). Considere isto:

localStorage.setItem("key", "value1")
localStorage.setItem("key2", "value2")
localStorage.setItem("getItem", "value3")
localStorage.setItem("setItem", "value4")

Como key, getItem e setItem são métodos prototípicos Object.keys(localStorage)retornados apenas ["key2"].

É melhor fazer algo assim:

let t = [];
for (let i = 0; i < localStorage.length; i++) {
  t.push(localStorage.key(i));
}
Mike Ratcliffe
fonte
@Darkrum Como o Firefox segue as especificações corretamente, key, getItem e setItem estariam ausentes se você usar object.keys()... Vou atualizar minha resposta para refletir isso.
Mike Ratcliffe
Basta ler as especificações para armazenamento local e não vejo o que você mencionou.
Darkrum
E leia a especificação de object.keys () parece que o Firefox não é o que está abaixo, se o que você diz é verdade.
precisa saber é o seguinte
@Darkrum Veja html.spec.whatwg.org/multipage/… e você pode ver que a especificação define o IDL com [Exposed=Window]. Isso resulta no comportamento que eu descrevo. Se fosse especificado [Exposed=Window,OverrideBuiltins], daria o comportamento que esperamos, mas a especificação não especifica OverrideBuiltins. Você pode ver uma discussão sobre isso em WHATWG / html aqui: github.com/whatwg/html/issues/183
Mike Ratcliffe
Novamente, como declararei, isso não tem nada a ver com o funcionamento de object.keys. A opção dos Mozillas de não permitir que eles sejam definidos é como eles interpretaram as especificações. Claramente, o Google sabia o que estava fazendo, porque o que um protótipo que não pode ser alterado, a menos que seja feito especificamente por outros meios, tem algo a ver com propriedades próprias.
Darkrum
-3

Também podemos ler pelo nome.

Digamos que salvamos o valor com o nome 'user' assim

localStorage.setItem('user', user_Detail);

Então podemos ler usando

localStorage.getItem('user');

Eu usei e está funcionando sem problemas, não há necessidade de fazer o loop for

Ali Adravi
fonte