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

JavaScript烘焙挂机游戏如何根据数组数据扣减对象资源并更新库存

实现方案

核心思路

通过动态遍历配方字段实现通用逻辑,无需为每种原料单独编写校验/扣减代码,自动适配不同成品的原料需求,同时先统一校验再修改数据,避免出现数据不一致问题。

完整代码

/**
 * 烘焙指定数量的成品
 * @param {string} productName 成品名称
 * @param {number} count 烘焙数量,默认值为1
 */
function bakeProduct(productName, count = 1) {
  // 匹配对应成品的烘焙配方
  const recipe = bakeInfo.find(item => item.Name === productName);
  if (!recipe) {
    throw new Error(`错误:不存在「${productName}」的烘焙配方`);
  }

  // 提取配方中的所有原料字段,排除名称字段
  const ingredients = Object.entries(recipe).filter(([key]) => key !== 'Name');

  // 第一步:全量校验原料存量是否足够
  for (const [ingredient, needPer] of ingredients) {
    const totalNeed = needPer * count;
    const currentStock = mainObj.Resources[ingredient] ?? 0;
    if (currentStock < totalNeed) {
      throw new Error(`原料不足:「${ingredient}」需要${totalNeed}份,当前仅存${currentStock}份`);
    }
  }

  // 第二步:校验全部通过后扣减原料
  for (const [ingredient, needPer] of ingredients) {
    mainObj.Resources[ingredient] -= needPer * count;
  }

  // 第三步:新增成品库存
  mainObj.Inventory[productName] = (mainObj.Inventory[productName] ?? 0) + count;
}

使用示例

// 烘焙2份曲奇
bakeProduct('Cookies', 2);
console.log(mainObj.Resources.Eggs); // 输出 10 - 1*2 = 8
console.log(mainObj.Inventory.Cookies); // 输出 2

优势说明

  • 自动适配所有配方:只会处理当前配方中存在的原料,不需要针对不同成品单独写分支逻辑,后续新增配方、新增原料都不需要修改函数本身
  • 数据安全:先完成所有原料校验再修改数据,不会出现部分原料扣减、后续原料不足导致的数据错乱
  • 兼容扩展:如果后续新增没有提前录入Inventory的成品,函数会自动初始化该成品的库存计数,无需提前修改mainObj结构

内容的提问来源于stack exchange,提问作者NickLeylandMedia

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.12 18:18:03