JSON属性不在第三个函数调用上更新新键的值

时间:2018-05-31 08:55:10

标签: javascript json

我提前为标题道歉,我在调试时找不到我一直在寻找的东西,但我可能不知道要搜索的正确术语。

我有以下对象:

const Game = {

user: {

  tool: {
    displayName: "shovel",
    level: 0,
    max: 1,
  },

  backpack: {
    level: 0,
    max: 10,
    contents: {
      ice: 5,
    }
  }
},

locations: {
  lifePod: {
    displayName: "Life Pod",
    loseOxygen: false
  },
  icyPlain: {
    displayName: "Ice Plain",
    loseOxygen: true,
    materials: {
        type: "ice",
    }
  },
  metalPlain: {
    displayName: "Metal Plain",
    loseOxygen: true,
    materials: {
        type: "metal",
    }
  }
}
};

我想使用以下功能将冰中物品的数量增加1.这可以100%正确地工作,但是当我尝试使用"金属"相反,它只允许最多2个。

function mineResource(locationName) {
  let newLocation = Game.locations[locationName];
  if (Game.user.currentLocation != "lifePod" && newLocation.materials != undefined && backpackNotFull()) {
    var alreadyInserted = false;
    materialType = newLocation.materials.type; //ice
    materialAmount = Game.user.tool.max; //1

    let {backpack} = Game.user;
    if (backpack.contents != null || backpack.contents != undefined) {
      for (item in backpack.contents) {
        if (item == materialType) {
          Game.user.backpack.contents[materialType] += Game.user.tool.max;
          alreadyInserted = true;
          refreshValues();
        } else if (alreadyInserted) {
            null;
        } else {
            Game.user.backpack.contents[materialType] = materialAmount;
            refreshValues();
        }
      };
    };
  };
}

我很困惑这个功能可以很好地使用Ice而不是Metal。作为测试我改变了:

contents: {
          ice: 5,
        }

为:

contents: {
          ice: 5,
          metal: 5,
        }

并且调用Game.user.backpack.contents仅显示{ice:5}并且调用contents.metal未定义。我当然得救了,精神焕发。不幸的是,因为我是初学者,所以我不知道自己不知道什么,并且很难找到它。我有一个把控制台日志放在" if(item == materialType){"他们正在输出,但没有增加柜台。

如果您想查看http://oxygen.meddleso.me/main.js

上的整个代码 编辑:我刚刚删除Ice,并将金属默认为5,现在Metal正常上升1,但如果我添加Ice就像我添加金属一样,Ice现在只增加到2。

1 个答案:

答案 0 :(得分:0)

当您添加金属但添加金属时,您需要添加金属

   } else {
        Game.user.backpack.contents[materialType] = materialAmount; // remove this line
        refreshValues();
    }

因此,当开采金属时,你会做内容['metal'] = 1(在冰循环上)和后来的内容['metal'] + = 1(在金属循环上)...因为你在项目上循环设置内容[项目]。但是我确定你不想在挖掘metalPlain时设置内容['ice'] = 1,所以只需删除这一行。