Javascript 用JSON覆盖本地存储
这是我们的后续问题 我开始使用localStorage函数, 我不确定它是否能按预期工作 我想覆盖JSON文件中的布尔值 玩家在一个阶段中点击一个出口,然后触发下一阶段的负载, 但我也希望它能保留一个事实,那就是这个阶段已经完成了 这是我的JSON数组,定义了默认情况下所有地下城都是不完整的:Javascript 用JSON覆盖本地存储,javascript,json,html,local-storage,craftyjs,Javascript,Json,Html,Local Storage,Craftyjs,这是我们的后续问题 我开始使用localStorage函数, 我不确定它是否能按预期工作 我想覆盖JSON文件中的布尔值 玩家在一个阶段中点击一个出口,然后触发下一阶段的负载, 但我也希望它能保留一个事实,那就是这个阶段已经完成了 这是我的JSON数组,定义了默认情况下所有地下城都是不完整的: var dungeon_prog = { "dungeon0_prog" : { "complete" : true }, "dungeon1_prog" : { "complete" :
var dungeon_prog = {
"dungeon0_prog" : {
"complete" : true
},
"dungeon1_prog" : {
"complete" : false
},
"dungeon2_prog" : {
"complete" : false
}
};
然后我将其设置为本地存储:
localStorage.setItem('dungeon_prog', JSON.stringify(dungeon_prog));
var dungeon_prog_obj = JSON.parse(localStorage.dungeon_prog);
我希望当玩家点击地下城1中的出口时,它能覆盖地下城1_prog“complete”false
到true
我该怎么做?
默认的“false”语句是否实际保存在localStorage中?
谢谢。现在
地下城\u prog\u obj
保存着你的JSON对象。为了回答上一个问题,yes-localStorage保存了整个JSON字符串,因此它也保存了布尔值
要覆盖它,只需设置布尔值,然后将其再次保存到同一本地存储项:
dungeon_prog_obj.dungeon1_prog.complete = true;
localStorage.setItem('dungeon_prog', JSON.stringify(dungeon_prog_obj));
编辑:
根据请求更新以回答评论中的问题
我不是100%确定这是问题所在,但您是说在页面刷新中,true
值不会持续存在。唯一合理的解释是,在每次加载页面时,您都使用localStorage.setItem('dungeon_prog',JSON.stringify(dungeon_prog)),用初始页面覆盖JSON
,其中dungeon\u prog
是问题中指定的初始JSON
与其这样做,不如在加载时检查localStorage
中是否有该项。您可以通过以下方式执行此操作:
// Check for object in localStorage
var dungeon_prog = JSON.parse(localStorage.dungeon_prog);
// If it does not exist, initialize it and save it
if (dungeon_prog != null) {
dungeonProg = {
"dungeon0_prog" : {
"complete" : true
},
"dungeon1_prog" : {
"complete" : false
},
"dungeon2_prog" : {
"complete" : false
}
};
localStorage.setItem('dungeon_prog', JSON.stringify(dungeon_prog));
}
难道你不能更改解析后的JSON中的值并重新格式化吗?
dungeon\u prog\u obj.dungeon1\u prog.complete=true
然后他们再次执行setItem()
:localStorage.setItem('dungeon\u prog',JSON.stringify(dungeon\u prog\u obj))代码>@Manishearth感谢您的评论。“我不知道那是什么。”劳琳,谢谢。我刚试过,很接近我想要的。在我完成《地下城1》后,它似乎显示为“真”,但在重新加载后,它又恢复为“假”。我希望它保持“真实”,除非我点击了一个新的游戏按钮或其他什么。顺便说一下,我建议您使用一个抽象来处理localStorage。像这样的话:谢谢!我试过了,但是你代码下的这个函数可能会导致问题:$(“#dungeon_prog_btn”)。单击(函数(){console.log(“dungeon 0(调试阶段)完成了吗?”:“+dungeon_prog_obj.dungeon 0_prog.complete”);console.log(“dungeon 1完成了吗?”+“dungeon_prog_obj.dungeon 1_prog.complete”);console.log(“dungeon 2完成了吗?”)+地下城(进度)地下城2(进度完成);代码>它给了我一个“dungeon_prog_obj未定义”错误。这是因为地牢程序是空的吗?@NaotoIda如果是空的,你当然会得到未定义的。我不明白什么对你不起作用。这样想:localStorage
是一个数据库。加载时,检查数据库中的副本项目。如果存在,则将其存储在变量中并使用它。如果没有,则使用问题中发布的代码初始化它,将其保存到localStorage
,然后使用它。这样,在下一次加载时,您将在本地存储中使用它。非常感谢您,现在它可以正常工作了。尽管这并不是为了表达我的感激之情,但如果你有兴趣的话,我希望能让你在发行前早点玩这个游戏。@NaotoIda当然,为什么不呢。很高兴你成功了!