【发布时间】:2014-12-23 23:21:11
【问题描述】:
我有一个在页面加载时触发的 javascript 函数。我的目标是在 localStorage 中存储一个 json 字符串,就像 "item1","item2","item3" 使用 unshift 方法在数组中一次构建一个项目。
这是我的函数在这里的样子:
function storedItems (){
var modelItem = $('#item').html(),
modelInt = $('#int').html();
if (localStorage.modelItem || localStorage.modelInt) {
var itemStack = [],
intStack = [],
itemStorage = localStorage.getItem("modelItem"),
intStorage = localStorage.getItem("modelInt"),
itemHistory = JSON.parse(itemStorage),
intHistory = JSON.parse(intStorage),
item = JSON.stringify(itemHistory).split(","),
int = JSON.stringify(intHistory).split(",");
alert("History " + item + " " + int + " " + item.length + " " + int.length);
if (item.length > 0) {
for ( var i = item.length - 1; i >= 0; i--) {
var obj = item[i],
newItem = JSON.parse(obj);
if(item.length > 1 && item.length < 3) {
itemStack.unshift(newItem);
itemStack.unshift(modelItem);
alert("StringFinder 2 " + modelItem + " " + itemStack);
} else {
newItem.unshift(modelItem);
alert("StringFinder 2 " + modelItem + " " + itemStack);
}
}
}
if (int.length > 0) {
for ( var i = int.length - 1; i >= 0; i--) {
var obj = int[i],
newInt = JSON.parse(obj);
if(int.length > 1 && int.length < 3) {
intStack.unshift(newInt);
intStack.unshift(modelInt);
alert("StringFinder 2 " + modelInt + " " + intStack);
} else {
newInt.unshift(modelInt);
localStorage.setItem("modelInt", JSON.stringify(newInt));
alert("StringFinder 2 " + modelInt + " " + intStack);
}
}
}
localStorage.setItem("modelItem", JSON.stringify(itemStack));
localStorage.setItem("modelInt", JSON.stringify(intStack));
alert("StringFinder 4 " + itemStack + " " + intStack);
} else {
localStorage.setItem("modelItem", JSON.stringify(modelItem));
localStorage.setItem("modelInt", JSON.stringify(modelInt));
}
}
我可以得到这个结果 "item1","item2" ,但如果它第三次触发,脚本会在第一次历史警报触发后失败。我基本上被难住了。我一直在寻找解决方案,并与其他一些人一起试图解决这个问题,但没有成功。请以任何方式提供帮助。
【问题讨论】:
-
一旦你解析到数组,就不需要再对数组元素使用 JSON.parse 了。把它想象成你只使用 JSON 方法来存储和检索 localStorage ,然后你正在使用本机脚本数组/对象
-
@charlietfl 出于某种原因,当我选择不对解析的 json 进行字符串化时,我会为每个字符而不是每个字符串获得一个项目/整数长度。因此,我尝试再次对其进行解析,以便将其正确地转移到数组中。有没有更好的方法来获取数组的长度而不计算每个字符?
-
我建议你重新开始逻辑并记住从 localStorage 解析后你有一个对象或数组。所以你不需要
item = JSON.stringify(itemHistory).split(","),之类的东西,如果有疑问,可以使用typeof来检查。 -
我的意思是它在解析时计算每个字母(例如:item.length 的结果将是 4 而不是 1)。
-
@OnlineOverlord 我很确定您无法在这里得到一个体面的答案是由于您无法(或者更确切地说,不愿意)提出一个体面的问题。请阅读我发布的 mcve 链接以供将来参考。如果您愿意调试并简化代码以解决问题的本质,那么您帖子中 80% 的代码可能会被省略,而您在几小时前就会得到答案。
标签: javascript arrays html local-storage