Como posso armazenar um array em localStorage? [duplicado]

esta pergunta já tem uma resposta aqui:

Se eu não precisasse de uma estoragem local, o meu código seria assim:
var names=new Array(); 
names[0]=prompt("New member name?");
Isto funciona. No entanto, preciso de guardar esta variável no local e está a revelar-se bastante teimosa. Eu tentei.
var localStorage[names] = new Array();
localStorage.names[0] = prompt("New member name?");
Para onde vou? errado?

Author: Peter Mortensen, 2010-07-29

6 answers

localStorage só suporta cadeias de caracteres. Utilizar JSON.stringify() e 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, 2016-02-26 11:13:29

Os localStorage e sessionStorage só conseguem lidar com cadeias de caracteres. Você pode estender os objetos de armazenamento padrão para lidar com arrays e objetos. Basta incluir este script e usar os novos 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 gravar um array ou um objecto e localStorage.getObj(key) para o obter. Os mesmos métodos funcionam com o objeto sessionStorage.

Se usar apenas os novos métodos para aceder ao armazenamento, todos os valores serão convertidos para um JSON-string antes de gravar e analisar antes de ser devolvido pelo getter.

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

 101
Author: Sebastian, 2012-04-11 15:40:44

Use JSON.stringify() e JSON.parse() como sugerido por no! Isto evita o problema talvez raro mas possível de um nome de membro que inclui o delimitador (por exemplo, nome de membro three|||bars).

 14
Author: jayeff, 2014-07-15 18:20:08

Acabei de criar isto:

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, 2012-10-16 18:49:55

A abordagem JSON funciona, no ie 7 você precisa json2.js, com ele funciona perfeitamente e apesar do comentário que diz o contrário, há uma estoragem local sobre ele. parece realmente a melhor solução com menos problemas. Claro que se poderia escrever scripts para fazer essencialmente a mesma coisa que json2 faz, mas há pouco ponto nisso.

Pelo menos com a seguinte linha de Versão há uma estoragem local, mas como disse, você precisa incluir o json2.js porque isso não está incluído pelo navegador em si: 4.0 (compatível; 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) (Eu teria feito este comentário sobre a resposta, mas não posso).

 3
Author: Lassi Kinnunen, 2012-04-26 10:04:28

Outra solução seria escrever uma embalagem que armazenasse o array assim:

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

Remove a sobrecarga da conversão para o JSON, mas seria irritante se precisasse de remover elementos, uma vez que teria de voltar a indexar o array:)

 2
Author: Znarkus, 2012-01-09 21:53:34