Bouclage via localStorage en HTML5 et JavaScript

92

Donc, je pensais que je pourrais simplement boucler sur localStorage comme un objet normal car il a une longueur. Comment puis-je parcourir cela?

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

Si je fais un localStorage.lengthil retourne 3ce qui est correct. Je suppose donc qu'une for...inboucle fonctionnerait.

Je pensais à quelque chose comme:

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

Mais en vain. Des idées?

L'autre idée que j'avais était quelque chose comme

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

Dans lequel le for...infonctionne.

Oscar Godson
la source

Réponses:

143

Vous pouvez utiliser la keyméthode. localStorage.key(index)renvoie la indexclé th (l'ordre est défini par l'implémentation mais constant jusqu'à ce que vous ajoutiez ou supprimiez des clés).

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

Si la commande est importante, vous pouvez stocker un tableau sérialisé JSON:

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

Le projet de spécification affirme que tout objet prenant en charge le clone structuré peut être une valeur. Mais cela ne semble pas encore pris en charge.

EDIT: Pour charger le tableau, ajoutez-y, puis stockez:

var words = JSON.parse(localStorage.getItem("words"));
words.push("hello");
localStorage.setItem("words", JSON.stringify(words));
Matthew Flaschen
la source
Merci beaucoup! C'est exactement ce que je cherchais. Je vais également examiner la chose JSON que vous avez envoyée. Ce serait parfait. C'est pour une application iOS de noms de bébé hors ligne HTML5.
Oscar Godson
Petite question, comment ajouterais-je à ce JSON? Comme, comment pourrais-je ajouter "bonjour" après "Dolor"?
Oscar Godson
1
vous basculez, rien qu'en regardant, ça devrait marcher. Y a-t-il une raison pour laquelle je devrais utiliser parse et non eval? J'utilise eval maintenant pour l'obtenir à partir d'une chaîne, mais l'analyse est-elle meilleure / plus rapide?
Oscar Godson
1
@Oscar, parseest plus sécurisé car il vous protège de l'exécution de code. Et souvent, c'est aussi beaucoup plus rapide. Voir blog.mozilla.com/webdev/2009/02/12/native-json-in-firefox-31
Matthew Flaschen
1
@BBagi, il renvoie quelle que soit l'entrée, décodée. Le niveau supérieur d'un texte JSON peut être un objet ou un tableau. EssayezJSON.parse('["Lorem", "Ipsum", "Dolor"]').length
Matthew Flaschen
32

Le moyen le plus simple est:

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

En plus de toutes les autres réponses, vous pouvez utiliser fonction $ .each de la bibliothèque jQuery:

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

  // key magic
  // value magic

});

Finalement, récupérez l'objet avec:

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

Miksiii
la source
2
Cela ne fonctionne que si vous utilisez jQuery. $est utilisé pour d'autres bibliothèques et est également souvent utilisé comme alias pour document.querySelectorAll. La question n'est pas non plus étiquetée comme question [jquery].
AnnanFay
9

Cela fonctionne pour moi dans Chrome:

for(var key in localStorage) {
  $('body').append(localStorage.getItem(key));
}
jtblin
la source
1
Quelle partie exactement? Cet extrait de code utilise jQuery selon la question d'origine. Pouvez-vous essayer cela dans la console chrome js? for(var key in localStorage) { console.log(localStorage.getItem(key)); }
jtblin
@jtblin Je viens de l'essayer, il est revenu TypeError: Cannot call method 'toString' of null, donc je suppose que 'key' renvoie null
Juan Carlos Alpizar Chinchilla
1
Cela fonctionne dans les versions récentes de Chrome, Safari et Firefox
mndrix
1
@JuanCarlosAlpizarChinchilla il n'y a pas de 'toString' dans le code donc ¯_ (ツ) _ / ¯. Comme indiqué dans le commentaire ci-dessus, fonctionne très bien dans tous les navigateurs récents.
jtblin
@jtblin mon commentaire a deux ans, alors ¯_ (ツ) _ / ¯ merci pour la tête haute
Juan Carlos Alpizar Chinchilla
1

En s'appuyant sur la réponse précédente, voici une fonction qui parcourra le stockage local par clé sans connaître les valeurs de clé.

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

Si vous examinez la sortie de la console, vous verrez que les éléments ajoutés par votre code ont tous une chaîne typeof. Alors que les éléments intégrés sont soit des fonctions {[code natif]}, soit dans le cas de la propriété length un nombre. Vous pouvez utiliser la variable typeofKey pour filtrer uniquement sur les chaînes afin que seuls vos éléments soient affichés.

Notez que cela fonctionne même si vous stockez un nombre ou un booléen comme valeur car ils sont tous deux stockés sous forme de chaînes.

Steve Isenberg
la source
1

Toutes ces réponses ignorent les différences entre les implémentations de localStorage dans les navigateurs. Les contributeurs dans ce domaine doivent fortement qualifier leurs réponses avec les plates-formes qu'ils décrivent. Une implémentation à l'échelle du navigateur est documentée à https://developer.mozilla.org/en/docs/Web/API/Window/localStorage et, bien que très puissante, ne contient que quelques méthodes de base. La lecture en boucle du contenu nécessite une compréhension de l'implémentation spécifique à chaque navigateur.

StarTraX
la source
Pourriez-vous donner un exemple de la façon dont l'une de ces réponses ne fonctionnerait pas sur un navigateur? C'était il y a longtemps, mais je ne me souviens pas avoir rencontré de problèmes avec ces réponses
Oscar Godson
J'avais l'intention que mon commentaire soit ajouté au flux global, pas à ce message en particulier et peut avoir été un peu dur. J'étais frustré à l'époque d'essayer de trouver une solution multi-navigateurs. L'exemple de Steve Isenberg (ci-dessous) contenant for (var key in localStorage) {typeofKey = (typeof localStorage [key]); console.log (clé, typeofKey); } Ne fonctionne pas sur les implémentations webKit (essayez-le!)
StarTraX
Cela fonctionne: for (var i = 0; i <localStorage.length; ++ i) {console.log (localStorage.key (i) + ":" + localStorage.getItem (localStorage.key (i))); }
StarTraX
1

localStorageest un Object.

Nous pouvons le parcourir avec JavaScript for / in Statement comme n'importe quel autre objet.

Et nous utiliserons .getItem()pour accéder à la valeur de chaque clé (x).

for (x in localStorage){
    console.log(localStorage.getItem(x));
}
Shayan
la source