如何用JavaScript实现商品捆绑组合折扣的价格计算逻辑
编程题解题思路与JS实现
核心逻辑说明
你的初始思路是完全可行的,推荐用JS原生对象(哈希表)作为存储结构完成计算,核心逻辑可以按两种路径实现:
路径1:逐天直接计算(更直观不易出错)
- 以日期为键,存储对应日期下popcorn和soda的购买数量,完成按日聚合
- 逐天核算金额:取两类商品数量的最小值作为可享受优惠的组合数,未凑成组合的剩余单品按原价计算
- 累加所有日期的金额得到总消费
路径2:先算原价再扣优惠(匹配你最初的思路)
- 先统计所有popcorn和soda的总数量,算出无优惠的总金额
- 逐天统计可凑的组合数,累加得到总组合数
- 每个组合可享受的优惠额为
8+2.5-9=1.5美元,总优惠 = 总组合数 * 1.5 - 最终金额 = 无优惠总金额 - 总优惠
示例输入验证
你给出的示例输入计算过程如下:
日期10212021:popcorn共2份,soda共2份,可凑2组组合,当日金额:
2*9 = 18美元
日期10222021:仅1份popcorn,无soda,当日金额:1*8 = 8美元
总金额:18+8=26美元
完整JS实现代码(路径1)
function calculateTotal(orders) { // 初始化哈希表,统计每天各商品的购买数量 const dailyCount = {}; for (const [date, item] of orders) { // 日期不存在时初始化当日商品计数 if (!dailyCount[date]) { dailyCount[date] = { popcorn: 0, soda: 0 }; } dailyCount[date][item] += 1; } let totalPrice = 0; // 逐天计算金额并累加 for (const dateKey in dailyCount) { const { popcorn, soda } = dailyCount[dateKey]; // 取最小值为可凑的组合数 const comboNum = Math.min(popcorn, soda); // 组合金额 + 剩余popcorn金额 + 剩余soda金额 const dayPrice = comboNum * 9 + (popcorn - comboNum) * 8 + (soda - comboNum) * 2.5; totalPrice += dayPrice; } return totalPrice; } // 测试示例输入 const testInput = [["10212021", "popcorn"], ["10222021", "popcorn"], ["10212021", "soda"],["10212021", "popcorn"],["10212021", "soda"]]; console.log(calculateTotal(testInput)); // 输出结果为26,符合预期
注意事项
- 输入数组中的商品名需要为字符串类型,注意补充引号避免语法报错
- 以上逻辑天然支持同一天多组组合的场景,无需额外处理边界情况
内容的提问来源于stack exchange,提问作者bob fett kanobi
相关产品推荐
相关产品推荐

