You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JSON对象属性异常:新资源键值无法正常更新的问题排查

问题排查与修复方案

嘿,我帮你找到了资源更新异常的根源!你的mineResource函数里的for循环逻辑存在严重问题,这才导致了各种奇怪的现象:

为什么会出现这些异常?

咱们拆解下现有循环的执行流程:

  • 当背包里只有ice时,挖掘ice会直接命中循环里的item == materialType分支,每次加1,这是正常的。
  • 但当背包里同时有ice和metal时,挖掘metal的流程就乱了:
    1. 循环先遍历到ice,此时item != materialType且alreadyInserted是false,执行else分支把metal重置为1(materialAmount是1)。
    2. 接着遍历到metal,命中条件分支加1,最终metal变成2。
    3. 每次调用挖掘函数都会重复这个“重置+加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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:40:11