798 votes

Comment stocker un tableau dans localStorage ?

Si je n'avais pas besoin de localStorage, mon code ressemblerait à ceci :

var names=new Array(); 
names[0]=prompt("New member name?");

Cela fonctionne. Cependant, j'ai besoin de stocker cette variable dans localStorage et elle s'avère assez têtue. J'ai essayé :

var localStorage[names] = new Array();
localStorage.names[0] = prompt("New member name?");

Où est-ce que je me trompe ?

0 votes

J'ai publié une solution complète pour maintenir les tableaux dans localStorage ou sessionStorage dans le fil de discussion dont ce sujet a été fermé en tant que doublon, car aucun de ces fils de discussion ne répond vraiment à la question posée à l'origine par Dave : stackoverflow.com/a/23516713/2208713 . J'espère que cela aidera certaines personnes.

0 votes

Une façon simple de gérer ce type de condition est d'utiliser la bibliothèque Opendb, qui est très complète pour traiter les tableaux et les objets. Vous pouvez suivre ce lien github.com/pankajbisht/openDB

1517voto

Dagg Nabbit Points 23918

localStorage ne prend en charge que les chaînes de caractères. Utilisez JSON.stringify() y JSON.parse() .

var names = [];
names[0] = prompt("New member name?");
localStorage.setItem("names", JSON.stringify(names));

//...
var storedNames = JSON.parse(localStorage.getItem("names"));

Vous pouvez également utiliser l'accès direct pour définir/obtenir un élément :

localstorage.names = JSON.stringify(names);
var storedNames = JSON.parse(localStorage.names);

6 votes

JSON n'est pas pris en charge par IE7 et les versions antérieures.

510 votes

@SaifBechan Ne vous inquiétez pas pour IE 6/7, nous parlons de localStorage

6 votes

Quelqu'un peut-il expliquer pourquoi vous devez faire cela et ce qui se passe, s'il vous plaît ?

139voto

Sebastian Points 446

El localStorage y sessionStorage ne peut traiter que des chaînes de caractères. Vous pouvez étendre le storage-objects par défaut pour gérer les tableaux et les objets. Incluez simplement ce script et utilisez les nouvelles méthodes :

Storage.prototype.setObj = function(key, obj) {
    return this.setItem(key, JSON.stringify(obj))
}
Storage.prototype.getObj = function(key) {
    return JSON.parse(this.getItem(key))
}

Utilisez localStorage.setObj(key, value) pour sauvegarder un tableau ou un objet et localStorage.getObj(key) pour le récupérer. Les mêmes méthodes fonctionnent avec le sessionStorage objet.

Si vous utilisez simplement les nouvelles méthodes pour accéder au stockage, chaque valeur sera convertie en chaîne JSON avant d'être enregistrée et analysée avant d'être renvoyée par le getter.

0 votes

Si vous aviez besoin de tous ces éléments, comment les récupéreriez-vous ?

1 votes

Les objets de stockage fournissent la propriété "length" pour déterminer le nombre d'objets enregistrés et la méthode "key(int index)" pour obtenir la clé actuelle. Vous pouvez donc essayer : for (var i = 0; i < localStorage.length; i++) console.log( localStorage.key(i) +" has value " + localStorage[localStorage.key(i)] )

1 votes

@Sebastian utilisant localStorage.length pourrait être erroné dans certains cas si le site web est également localStorage pour stocker quelque chose.

18voto

jayeff Points 476

Utilisez JSON.stringify() y JSON.parse() comme suggéré par no ! Cela évite le problème, peut-être rare mais possible, d'un nom de membre qui inclut le délimiteur (par exemple, nom de membre three|||bars ).

0 votes

Pouvez-vous nous montrer une meilleure alternative ?

12 votes

Cela ne permet pas de répondre à la question. Pour critiquer ou demander des précisions à un auteur, laissez un commentaire sous son article.

0 votes

@ChiefTwoPencils avez-vous lu les commentaires avant de les signaler ?

9voto

Klederson Bueno Points 133

Je viens de créer ceci :

https://gist.github.com/3854049

//Setter
Storage.setObj('users.albums.sexPistols',"blah");
Storage.setObj('users.albums.sexPistols',{ sid : "My Way", nancy : "Bitch" });
Storage.setObj('users.albums.sexPistols.sid',"Other songs");

//Getters
Storage.getObj('users');
Storage.getObj('users.albums');
Storage.getObj('users.albums.sexPistols');
Storage.getObj('users.albums.sexPistols.sid');
Storage.getObj('users.albums.sexPistols.nancy');

3 votes

C'est le genre de chose que je recherchais, sauf qu'il parcourt les clés de l'objet fourni et enregistre la (seule) valeur liée dans chacune d'elles. Merci beaucoup pour l'inspiration.

2voto

Znarkus Points 5025

Une autre solution serait d'écrire un wrapper qui stocke le tableau comme ceci :

localStorage.setItem('names_length', names.length);
localStorage.setItem('names_0', names[0]);
localStorage.setItem('names_1', names[1]);
localStorage.setItem('names_' + n, names[n]);

Supprime la surcharge de la conversion en JSON, mais serait ennuyeux si vous avez besoin de supprimer des éléments, car vous auriez à réindexer le tableau :)

1 votes

Annule le gain de performance lié à l'absence de JSONification.

1 votes

Au lieu de names_length utiliser names_keys et vous n'avez pas besoin de réindexer ! Cela vous permettrait également d'utiliser des clés de type chaîne. Bien sûr, cela n'a de sens que si les éléments du tableau sont assez gros.

0 votes

@PiTheNumber Si names_keys contient un tableau d'indices, n'est-ce pas une situation de poule et d'œuf ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X