2010-07-28 17 views
447

Si yo no necesitaba localStorage, mi código sería el siguiente:¿Cómo guardo una matriz en localStorage?

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

Esto funciona. Sin embargo, necesito almacenar esta variable en localStorage y está resultando bastante terca. Lo he intentado:

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

¿Dónde me estoy equivocando?

+0

He publicado una solución completa para el mantenimiento de las matrices de almacenamiento local o sessionStorage en el hilo estaba cerrado como un duplicado de, porque el hilo inferior en realidad responde a la pregunta planteada originalmente por Dave: http://stackoverflow.com/a/23516713/2208713.Espero que ayude a algunas personas. –

+0

Manera fácil de manejar ese tipo de condición que puede usar la biblioteca de opendb muy útil para lidiar con la matriz, el objeto. Puede seguir este enlace https://github.com/pankajbisht/openDB – pankaj98

Respuesta

857

localStorage solo admite cadenas. Use 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")); 
+3

JSON no es compatible con IE7 y versiones anteriores. –

+280

@SaifBechan No te preocupes por IE 6/7, estamos hablando de 'localStorage' – tungd

+5

¿Alguien puede explicar por qué tienes que hacer esto y qué está pasando, por favor? –

15

Uso JSON.stringify() y JSON.parse() como sugiere no! Esto evita el problema quizás raro pero posible de un nombre de miembro que incluye el delimitador (por ejemplo, nombre de miembro three|||bars).

+0

¿Puede mostrarnos una mejor alternativa? – Phil

+3

Esto no proporciona una respuesta a la pregunta. Para criticar o solicitar aclaraciones de un autor, deje un comentario debajo de su publicación. – ChiefTwoPencils

+0

@ChiefTwoPencils ¿ha leído los comentarios antes de marcar? – J0HN

4

Otra solución sería escribir un contenedor que almacena la matriz de esta manera:

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

Elimina la sobrecarga de convertir a JSON, pero sería molesto si es necesario eliminar los elementos, ya que se tendría que volver a indexar el conjunto :)

+0

Elimina la ganancia de rendimiento de no JSONifying. –

+0

@CamiloMartin Sí, eso es probablemente cierto ... :) – Znarkus

+1

En lugar de 'names_length' usa' names_keys' y no necesitas volver a indexar! Esto también te permitiría usar claves de cadena. Por supuesto, esto solo tiene sentido si los elementos de la matriz son un poco ruidosos. – PiTheNumber

91

El localStorage y sessionStorage solo pueden manejar cadenas. Puede ampliar los objetos de almacenamiento predeterminados para manejar matrices y objetos. Basta con incluir esta secuencia de comandos y el uso de los nuevos métodos:

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

Uso localStorage.setObj(key, value) para guardar una matriz u objeto y localStorage.getObj(key) para recuperarlo. Los mismos métodos funcionan con el objeto sessionStorage.

Si solo utiliza los nuevos métodos para acceder al almacenamiento, cada valor se convertirá en una cadena JSON antes de guardarlo y analizarlo antes de que el getter lo devuelva.

Fuente: http://www.acetous.de/p/152

+0

si necesitaras todas ellas ¿cómo las recuperarías? –

+0

Los objetos de almacenamiento proporcionan la propiedad "longitud" para determinar el recuento de objetos guardados y el método "clave (índice int)" para obtener la clave actual. Así que puedes probar: 'for (var i = 0; i Sebastian

+1

@Sebastian con ** localStorage.length ** podría ser incorrecto en algunos casos si el sitio web también es ** localStorage ** para almacenar algo. –

3

El enfoque JSON funciona, es decir, el 7 debe json2.js, con lo que funciona perfectamente, ya pesar de un comentario diciendo lo contrario existe localStorage en él. realmente parece ser la mejor solución con la menor molestia. Por supuesto, uno podría escribir guiones para hacer esencialmente lo mismo que json2, pero tiene poco sentido.

al menos con la siguiente cadena de versión hay localStorage, pero como se dijo necesita incluir json2.js porque no está incluido en el navegador: 4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; BRI/2; NP06; .NET4.0C; .NET4.0E; Zune 4.7) (yo lo haría he hecho un comentario sobre la respuesta, pero no puedo).

5

creado esta:

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'); 
+2

Este es el tipo de cosa que estaba buscando, excepto que iba a caminar el claves del objeto proporcionado y guarde el valor vinculado (único) en cada uno. Muy agradecido por la inspiración. – twobob

Cuestiones relacionadas