¿Cómo puedo almacenar una matriz en localStorage? [duplicar]


Esta pregunta ya tiene una respuesta aquí:

Si no necesitara localStorage, mi código se vería así:

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

Esto funciona. Sin embargo, necesito almacenar esta variable en localStorage y está demostrando ser bastante terco. He intentado:

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

¿En qué me estoy equivocando?

Author: Peter Mortensen, 2010-07-29

6 answers

localStorage solo soporta cadenas. Utilizar 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"));
 927
Author: Dagg Nabbit,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-02-26 11:13:29

Los localStorage y sessionStorage solo pueden manejar cadenas. Puede extender los objetos de almacenamiento predeterminados para manejar matrices y objetos. Solo incluye este script y usa 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))
}

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

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

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

 101
Author: Sebastian,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-04-11 15:40:44

Use 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).

 14
Author: jayeff,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-07-15 18:20:08

Acabo de crear esto:

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');
 5
Author: Klederson Bueno,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-10-16 18:49:55

El enfoque JSON funciona, en ie 7 necesita json2.js, con él funciona perfectamente y a pesar del comentario que dice lo contrario hay localStorage en él. realmente parece la mejor solución con la menor molestia. Por supuesto, uno podría escribir scripts para hacer esencialmente lo mismo que hace json2, pero no tiene mucho sentido.

Al menos con la siguiente cadena de versión hay localStorage, pero como se dijo, debe incluir json2.js porque eso no está incluido en el navegador sí mismo: 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) (Habría hecho esto un comentario sobre la respuesta, pero no puedo).

 3
Author: Lassi Kinnunen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-04-26 10:04:28

Otra solución sería escribir un wrapper que almacene el array así:

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 necesita eliminar elementos, ya que tendría que volver a indexar la matriz:)

 2
Author: Znarkus,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-01-09 21:53:34