Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在localStorage中存储阵列?_Javascript_Arrays_Html_Local Storage - Fatal编程技术网

Javascript 如何在localStorage中存储阵列?

Javascript 如何在localStorage中存储阵列?,javascript,arrays,html,local-storage,Javascript,Arrays,Html,Local Storage,如果我不需要localStorage,我的代码将如下所示: var names=new Array(); names[0]=prompt("New member name?"); localStorage.setItem('names_length', names.length); localStorage.setItem('names_0', names[0]); localStorage.setItem('names_1', names[1]); localStorage.setItem

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

var names=new Array(); 
names[0]=prompt("New member name?");
localStorage.setItem('names_length', names.length);
localStorage.setItem('names_0', names[0]);
localStorage.setItem('names_1', names[1]);
localStorage.setItem('names_' + n, names[n]);
这很有效。然而,我需要将这个变量存储在localStorage中,事实证明它非常顽固。我试过:

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

哪里出错了?

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

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

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

按照no的建议使用
JSON.stringify()
JSON.parse()
!这可以防止包含分隔符的成员名称(例如,成员名称
三个| | | |条
)可能出现的罕见但可能出现的问题。

另一种解决方案是编写一个包装器来存储数组,如下所示:

var names=new Array(); 
names[0]=prompt("New member name?");
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的开销,但如果需要删除元素,则会很烦人,因为您必须重新索引数组:)

本地存储和会话存储只能处理字符串。可以扩展默认存储对象以处理阵列和对象。只需包含此脚本并使用新方法:

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(键,值)
保存数组或对象,使用
localStorage.getObj(键)
检索它。同样的方法也适用于
sessionStorage
对象

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


来源:

JSON方法很有效,在IE7上你需要json2.js,它可以完美地工作,尽管有一条评论说它有本地存储。这似乎真的是最简单的解决方案。当然,我们可以编写脚本来做与json2基本相同的事情,但这没有什么意义

至少在以下版本字符串中有localStorage,但正如前面所说,您需要包括json2.js,因为浏览器本身不包括它: 4.0(兼容;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) (我本想在回复中对此发表评论,但不能)。

刚刚创建了以下内容:



IE7及更早版本不支持JSON。@SaifBechan不必担心IE6/7,我们讨论的是
localStorage
有人能解释一下为什么要这样做以及发生了什么吗?@Howdy_McGee As
localStorage
只支持字符串,数组必须转换成字符串格式。最好的方法是将其转换为
JSON
数组,因为它很容易在这两种状态之间进行转换(
JSON
只是一段很长的字符串数据)。如果你不明白的话,你可能想阅读一下JSON@JonathanTonge,你可以做一些类似于
JSON.parse(localStorage[“names”]| | null)
的事情,如果你愿意的话。杀死不进行JSonification的性能增益。而不是
names\u length
使用
names\u keys
,你不需要重新索引!这还允许您使用字符串键。当然,这只有在数组元素是hugh的情况下才有意义。@PiTheNumber如果
names\u keys
包含一个索引数组,这不是鸡/蛋的情况吗?@Znarkus正如我所说,这只对hugh数组元素有意义。例如,如果每个元素有100KB,最好使用带有
键的小条目
@PiTheNumber什么是hugh?您能给我们展示一个更好的替代方案吗?这并不能回答这个问题。若要评论或要求作者澄清,请在他们的帖子下方留下评论。@chieftwoils您在标记之前读过评论吗?@J0HN:是的,我读过。从什么时候开始,会员声誉是违反规则的好理由?事实上,建议删除的自动消息不是特别提到不要将评论作为答案发布,并建议发帖人等到他们有足够的声誉发表评论和投票时再发布吗?海报上说这不是答案;还有什么证据需要存在?@ChiefTwoPencils:一些历史背景:当我发表这篇评论时,公认的答案是用Ian的“| | |”进行连接和拆分(注:这个答案不再存在)。因为我认为这个答案实际上是有害的,所以我发布了我的答案。今天,我的非答案不再是必要的(正确的答案被接受,并且有健康剂量的投票)。我不太熟悉这些指导原则:是否可以/建议删除我的“答案”?如果需要所有答案,您将如何检索它们?存储对象提供属性“长度”以确定保存对象的计数,并提供方法“键(int index)”以获取当前键。所以您可以尝试:
for(var i=0;i
@Sebastian使用localStorage.length在某些情况下可能是错误的,如果网站也使用localStorage来存储某些内容。在迭代localStorage的所有元素时,您可以在模块特定值之前加上前缀,并用该前缀删除所有内容。我在解决方案中使用了相同的方法,这为localStorage的工作方式提供了一个最低限度的界面:)我已经发布了一个完整的解决方案,用于在localStorage或sessionStorage中维护阵列,该线程作为其副本关闭,因为nether线程确实回答了Dave最初提出的问题:。希望它能帮助一些人。处理这种情况的简单方法你可以使用opendb库非常充分地使用数组,对象来处理。你可以跟随这个链接,这是我一直在寻找的东西,除了它会遍历所提供对象的键,并在每个对象中保存(单个)链接值。非常感谢你的鼓励。