Javascript 用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" :

这是我们的后续问题

我开始使用localStorage函数, 我不确定它是否能按预期工作

我想覆盖JSON文件中的布尔值

玩家在一个阶段中点击一个出口,然后触发下一阶段的负载, 但我也希望它能保留一个事实,那就是这个阶段已经完成了

这是我的JSON数组,定义了默认情况下所有地下城都是不完整的:

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当然,为什么不呢。很高兴你成功了!