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
相关产品推荐
相关产品推荐

