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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 23:36:08