JSON对象属性异常:新资源键值无法正常更新的问题排查
问题排查与修复方案
嘿,我帮你找到了资源更新异常的根源!你的mineResource函数里的for循环逻辑存在严重问题,这才导致了各种奇怪的现象:
为什么会出现这些异常?
咱们拆解下现有循环的执行流程:
- 当背包里只有
ice时,挖掘ice会直接命中循环里的item == materialType分支,每次加1,这是正常的。 - 但当背包里同时有
ice和metal时,挖掘metal的流程就乱了:- 循环先遍历到
ice,此时item != materialType且alreadyInserted是false,执行else分支把metal重置为1(materialAmount是1)。 - 接着遍历到
metal,命中条件分支加1,最终metal变成2。 - 每次调用挖掘函数都会重复这个“重置+加1”的操作,所以
metal永远停在2。
- 循环先遍历到
- 手动添加
metal:5后,调用挖掘函数会触发上述重置,把metal从5改成1再加1到2,看起来像是metal消失了,实际是被覆盖了。
修复后的代码
你完全不需要用for循环来判断资源是否存在,直接通过对象属性访问就能搞定,逻辑更简单也更可靠:
function mineResource(locationName) { const newLocation = Game.locations[locationName]; // 校验前置条件:不在救生舱、当前位置有资源、背包未满 if (Game.user.currentLocation !== "lifePod" && newLocation.materials && backpackNotFull()) { const materialType = newLocation.materials.type; const addAmount = Game.user.tool.max; const backpackContents = Game.user.backpack.contents; // 直接判断资源是否已在背包中 if (backpackContents.hasOwnProperty(materialType)) { // 存在就累加数量 backpackContents[materialType] += addAmount; } else { // 不存在就新增该资源 backpackContents[materialType] = addAmount; } refreshValues(); } }
优化说明
- 用
hasOwnProperty直接判断资源是否存在,彻底避免了循环遍历带来的重置问题。 - 把重复调用的
Game.user.tool.max存到变量addAmount里,让代码更清晰。 - 替换了容易出错的
var为const,避免变量提升和意外修改。 - 移除了无意义的
else if (alreadyInserted)空逻辑,简化代码结构。
额外小贴士
- 检查下
backpackNotFull()函数,确保它能正确计算背包已占用空间(比如把contents里的所有资源数量相加,和backpack.max比较)。 - 可以给
Game.user.backpack.contents默认设为空对象,这样就不用额外判断null/undefined啦。
内容的提问来源于stack exchange,提问作者DrauL
相关产品推荐
相关产品推荐

