【问题标题】:Pricing discount logic, 2 for $4, 6 for the price of 5定价折扣逻辑,2 为 4 美元,6 为 5 的价格
【发布时间】:2021-02-24 15:39:34
【问题描述】:

所以我目前正在研究某些情况下的定价逻辑:

  • 1 只手套售价 2.50 美元,2 只手套售价 4 美元,因此可享受 20% 的折扣。
  • 如果一个人买了 3 只手套,那么应该是 4 美元 + 原价 2.50 美元,总计 6.50 美元
  • 如果一个人买了 4 只手套,那么应该是 8 美元。

  • 1 块口香糖 0.65 美元,你可以花 5 块买 6 块,所以 6 块 3.25 美元而不是 3.90 美元
  • 如果一个人买了 7 个,那么应该是 6 个,3.25 美元 + 原价 0.65 美元,总计 3.90 美元
  • 如果一个人买8个,那么应该是6个3.25美元+(原价0.65美元*2)总计4.55美元

所以在什么指数/阶段需要应用折扣是非常重要的

我从这篇文章中获得了我的逻辑灵感: http://codekata.com/kata/kata01-supermarket-pricing/

我的代码灵感来自这篇文章: https://github.com/raddanesh/Kata01

特别是 VolumePricingStrategy 如下图所示:

根据我想要实现的逻辑,这是我的代码尝试:

//2 for $4
const gloves = {quantity: 3, price: 2.50 }

function volumePriceGloves(threshold = 2){
  let regularPrice = gloves.quantity * gloves.price;
  let volumeDiscount = 0;
    
  let volumePrice = regularPrice * 0.8;

  if(gloves.quantity >= threshold){
    volumeDiscount = threshold * gloves.price - volumePrice
  }
  return regularPrice - volumeDiscount;
}

// 5 for the price of 6
const gum = {quantity: 7, price: 0.65 }

function volumePriceGum(threshold = 6){
  let regularPrice = gum.quantity * gum.price;
  let volumeDiscount = 0;
  
  let volumePrice = regularPrice * 0.16666667;

  if(gum.quantity % threshold){
    volumeDiscount = threshold * gum.price - volumePrice;
  }
  
  return regularPrice - volumeDiscount; 
}

我的代码显然是错误的,因为它在调用函数时输出了不正确的值。虽然我非常喜欢 github.com/raddanesh/Kata01 写的代码并且能理解它背后的概念。我真的很难真正理解 volumePrice 代表什么。在我看来,volumePrice 是该产品达到阈值时的折扣价。

因此,对于手套场景,volumePrice 为 regularPrice * 0.8 是有意义的,它代表原始价格的 20% 折扣。但是,我的意图并没有完全体现在我的代码中 volumePriceGloves(3) 返回 6 而不是 6.5 并且如果您更改阈值参数量,所有场景都不匹配。非常感谢任何想法/帮助!

对于口香糖场景,我不太确定 github.com/raddanesh/Kata01 的代码示例是否可以应用于此逻辑。因为它看起来完全不同,我不确定真正采取什么方法。 如您所见,我在这个常规价格 * 0.16666667 上设置了 volumePrice,这反映了每口口香糖的折扣金额。

我想到的另一个想法是可能将价格放入数组中,并在满足阈值的情况下弹出最后一个价格,但是我不确定这有多可行,我仍然需要数组中的该项目进行进一步计算。这个我认为是最棘手的,我在网上找不到很多好的例子,因此这篇文章!欢迎所有想法/建议!

【问题讨论】:

  • I'm really struggling to truly understand what volumePrice is representing -- 批量价格只是当有人订购一定数量的产品时给予的折扣。例如,如果您订购 1 支铅笔,每支铅笔的成本为 1 美元。如果您订购两支铅笔,每支铅笔的成本为 0.90 美元,总成本为 9 美元而不是 10 美元。如果您订购 100 支铅笔,每支铅笔的成本为 0.80 美元,总成本为 80 美元,而不是 90 美元或 100 美元。
  • 简而言之,我认为您可能想多了。如果这是一个家庭作业问题,请询问样本输入和输出。这应该可以澄清您的一些担忧。
  • @RobertHarvey 嗯好的。这有点道理,但我不能以我想要的方式自定义 volumePrice (这就是我认为我在上面所做的)。你刚才提到的例子是任意的吧?你可能是对的,我想太多了
  • 是的,我的例子是任意的。批量折扣括号可以以任何您想要的方式存储:直接在代码中、在字典中、在数据库中、在 JSON 文件中等等。

标签: javascript arrays function object modulus


【解决方案1】:

这两种情况需要几乎相同的逻辑 - 有单独价格和团体价格,任何不适合团体的商品都将获得单独价格。

所以我的方法是仅将其用作逻辑的基础。编写一个函数,将数量、团体数量、个人价格和团体价格作为输入,如下所示:

function getPrice(qty, groupQty, indivPrice, groupPrice) {
  const groupCount = Math.floor(qty / groupQty);
  const indivCount = qty % groupQty;
  return (groupCount * groupPrice) + (indivCount * indivPrice);
}

console.log(getPrice(5, 2, 1.5, 2.5)); // groups of 2 cost 2.5, but 1 costs 1.5 -- total should be 6.5

因此,从现在开始,您需要做的就是根据交易类型找出“groupPrice”

【讨论】:

  • 谢谢,这绝对是我开始的良好基础。我会在我的情况下尽快给你绿色勾号的答案!
【解决方案2】:

有很多方法可以做到这一点。我倾向于走更少代码的路线。

我会走这条路。

if(quantity => threshold){

discounteditems = Math.floor(quantity/threhold);
remainder = quantity%threhold;
discountedtotalprice = discounteditems * discountedprice;
fullprice = remainder * fullprice;

}

这样您可以获得所有打折商品,超出此阈值的商品您收取全价。

对我来说,这是一种更简单的方法来获得你正在寻找的欲望。

【讨论】:

  • 有趣!就像你自己一样,我也喜欢更少的代码。我很快就会告诉你我如何整合你的建议。
  • TKoL 在我之前到达那里 =)... 我需要更快地打字,哈哈。相同的概念 - 只需使用 Math.floor 和 Modulus (%)。我会使用他的代码 - 它更容易插入。
  • 呵呵,谢谢,我会给你“这个答案很有用”,因为它是。如果我实现你的或 TkoL 的,我会让 uno。
猜你喜欢
  • 2022-08-11
  • 2023-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-16
相关资源
最近更新 更多