如何将数组存储在localStorage中?
如果我不需要localStorage,我的代码将如下所示:
var names=new Array(); names[0]=prompt("New member name?");
这工作。 但是,我需要将这个variables存储在localStorage中,并且certificate它是相当固执的。 我试过了:
var localStorage[names] = new Array(); localStorage.names[0] = prompt("New member name?");
我哪里错了?
localStorage
只支持string。 使用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
和sessionStorage
只能处理string。 您可以扩展默认存储对象来处理数组和对象。 只要包含这个脚本并使用新的方法:
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
对象使用相同的方法。
如果您只是使用新方法来访问存储,则每个值在被getter返回之前都会在保存和parsing之前转换为JSONstring。
来源: http : //www.acetous.de/p/152
使用JSON.stringify()
和JSON.parse()
,build议使用no! 这可以防止包含分隔符的成员名称(例如,成员名称three
bars )的罕见但可能的问题。
另一个解决scheme是编写一个存储这个数组的包装器:
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的开销,但是如果你需要删除元素,会很麻烦,因为你必须重新索引数组:)
刚刚创build了这个:
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');
JSON方法的工作原理,即7你需要json2.js,它完美的作品,尽pipe有一个评论说,否则有它的localStorage。 它似乎是最简单的最好的解决scheme。 当然,我们可以编写脚本来做与json2基本相同的事情,但是这里没有什么意义。
至less在下面的版本string中有localStorage,但是如你所说,你需要包含json2.js,因为它不包含在浏览器本身中: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; .NET 4.0C; .NET 4.0E; Zune 4.7)(我会对此做出评论答复,但不能)。