如何在localStorage中存储数组?

如果我不需要localStorage,我的代码将如下所示:

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

这有效。但是,我需要将此变量存储在localStorage中,事实证明它非常顽固。我尝试过:

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

我哪里做错了?

807518 次浏览

localStorage只支持字符串。使用JSON.stringify()JSON.parse()

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

您还可以使用直接访问来设置/获取项目:

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

按照no的建议使用JSON.stringify()JSON.parse()!这可以防止可能罕见但可能存在的包含分隔符的成员名称问题(例如成员名称three|||bars)。

另一种解决方案是编写一个包装器,像这样存储数组:

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

删除转换为JSON的开销,但如果您需要删除元素会很烦人,因为您必须重新索引数组:)

localStoragesessionStorage只能处理字符串。您可以扩展默认的存储对象以处理数组和对象。只需包含此脚本并使用新方法:

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

使用localStorage.setObj(key, value)保存数组或对象,使用localStorage.getObj(key)检索它。相同的方法适用于sessionStorage对象。

如果您只是使用新方法来访问存储,则每个值都将在保存之前转换为JSON字符串,并在getter返回之前对其进行解析。

JSON方法工作,即7你需要json2.js,它工作得很好,尽管有一个评论说否则有本地存储。它看起来确实是麻烦最少的最佳解决方案。当然,人们可以编写脚本来做与json2基本相同的事情,但这没有什么意义。

至少在以下版本字符串中有localStorage,但如前所述,您需要包含json2.js,因为浏览器本身不包含它:4.0(兼容;MSIE 7.0;Windows NT 6.1;WOW64;三叉戟/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)(我本想在回复中发表评论,但不能)。

刚刚创建了这个:

https://gist.github.com/3854049

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