【问题标题】:Overwriting localStorage with JSON用 JSON 覆盖 localStorage
【发布时间】:2014-01-03 15:51:15
【问题描述】:

这是this的后续问题

我开始使用 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 的出口时覆盖 dungeon1_prog “完成”falsetrue

我该怎么做? 并且默认的“假”语句实际上是否保存在 localStorage 中? 谢谢。

【问题讨论】:

  • 不能只更改解析后的 JSON 中的值并重新字符串化吗?
  • dungeon_prog_obj.dungeon1_prog.complete = true 他们再次执行setItem()localStorage.setItem('dungeon_prog', JSON.stringify(dungeon_prog_obj));
  • @Manishearth 感谢您的评论。我不确定那是什么。
  • @RaulRene 谢谢。我刚刚试了一下,和我想要的很接近。完成dungeon1后似乎显示“true”,但重新加载后,它恢复为“false”。我希望它保持“真实”,除非我按下新的游戏按钮或其他东西。
  • 顺便说一下,我建议您使用抽象来处理 localStorage。像这样:github.com/orangecoding/jsutils/blob/master/storage.js

标签: javascript json html local-storage craftyjs


【解决方案1】:

dungeon_prog_obj 现在包含您的 JSON 对象。要回答您的最后一个问题,是的 - localStorage 保存了整个 JSON 字符串,因此它还保存了布尔值。

要覆盖它,您只需设置布尔值并将它们再次保存到相同的 localStorage 项:

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 覆盖JSON,其中dungeon_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));
}

【讨论】:

  • 谢谢!我试过了,但你的代码下的这个函数可能会导致问题:$("#dungeon_prog_btn").click(function() { console.log("Is Dungeon 0(Debug stage) complete?: " + dungeon_prog_obj.dungeon0_prog.complete); console.log("Is Dungeon 1 complete?: " + dungeon_prog_obj.dungeon1_prog.complete); console.log("Is Dungeon 2 complete?: " + dungeon_prog_obj.dungeon2_prog.complete); }); 它给了我一个“dungeon_prog_obj is not defined”错误。这是因为 dungeon_prog 为空吗?
  • @NaotoIda 如果它为空,你当然会得到undefined。我不明白什么不适合你。这样想:localStorage 是一个数据库。加载时,您检查数据库中的 dungeon_prog 项目。如果它在那里,你将它存储在一个变量中并使用它。如果没有,请使用您在问题中发布的代码对其进行初始化,将其保存到localStorage,然后使用它。这样,下次加载时,您将在localStorage 中拥有它。
  • 非常感谢,现在它按预期工作了。尽管这并不能表达我的感激之情,但如果您有兴趣,我希望可以在发布前让您早一点玩游戏。
  • @NaotoIda 当然,为什么不呢。很高兴它对你有用!
猜你喜欢
  • 2013-12-23
  • 2020-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-27
  • 2017-04-12
  • 1970-01-01
  • 2018-01-25
相关资源
最近更新 更多