JS如何按增量规则生成食谱食材用量的所有组合
多食材用量全组合生成方案
你当前已通过handleStretch函数生成了按食材分类的单食材用量变体二维数组stretchedRecipes,要生成覆盖所有跨食材搭配的完整食谱变体,本质是计算这个二维数组的笛卡尔积——即从每个食材对应的用量子数组中各取一个值,拼接成一套完整的食材用量配置,覆盖所有可能的用量搭配场景。
核心实现思路
- 初始化一个仅包含空配置的临时数组,作为组合计算的起点
- 按顺序遍历每个食材的可选用量列表,每次将当前已生成的所有半成品组合,和当前食材的每一个可选用量做拼接,生成新的临时组合列表
- 所有食材遍历完成后,临时数组中存储的就是全量的跨食材用量组合
可直接复用的代码实现(适配现有JS逻辑语境)
/** * 生成所有跨食材用量组合 * @param {Array<Array>} stretchedRecipes 二维数组,每个子数组对应单种食材的全部可选用量变体 * @returns {Array<Array>} 全量食谱配置,每个子数组为一套完整的各食材用量方案 */ function generateAllCombinations(stretchedRecipes) { // 初始状态为仅含空组合的数组 let result = [[]] for (const ingredientOptions of stretchedRecipes) { const temp = [] // 遍历已有半成品组合 for (const combo of result) { // 拼接当前食材的每一个可选用量 for (const option of ingredientOptions) { temp.push([...combo, option]) } } result = temp } return result } // 对接现有逻辑的调用方式 const stretchedRecipes = handleStretch(ingredientsToStretch2) // 已实现的单食材变体生成逻辑 const allRecipeVariants = generateAllCombinations(stretchedRecipes)
效果示例:如果3种食材的可选用量档位分别是3档、2档、2档,最终会生成322=12套完整配置,完全覆盖你提到的「单食材加量其余不变」「多食材同时加量」等所有场景。
注意事项
- 组合总数是各食材用量档位数的乘积,食材种类多、单食材档位多的时候数据量会快速上涨,建议根据业务需求提前加过滤规则(比如限制总份数增量上限、排除不符合配比要求的组合),避免内存占用过高
- 该逻辑不依赖任何第三方库,如果使用其他编程语言,只需要按照迭代拼接的思路改写语法即可,核心计算逻辑通用
内容的提问来源于stack exchange,提问作者Ripas55
相关产品推荐
相关产品推荐

