用于在促销销售活动中应用多个折扣的Javascript算法



我们店里有促销活动,买1个键盘8折,买2个键盘7折,买3个键盘4折。鉴于键盘的产品价格为199.99美元。您最多只能购买6个键盘,如果您购买的键盘超过6个,将不再享受额外的折扣。

谁能帮我创建一个算法来应用折扣,并计算总金额,如果客户购买1到6个或更多的这个特定的产品?

Buy 1 Keyboard  = 20% discount
Buy 2 Keyboards = 30% discount
Buy 3 Keyboards = 40% discount

这是第一个代码,我试图解决我们的问题,但我得到不正确的结果:

let cart = [];
let disc_amount;
let total_amount;
discFor1 = 0.2;
discFor2 = 0.3;
discFor3 = 0.4;
discFor4 = 0.6;
discFor5 = 0.7;
discFor6 = 0.8;
const keyboard = {
id: "1001",
name: "Yamaha PSR-E273 Keyboard",
reg_price: 199.99,
disc_price: 0
};

const addKeyboardToCart = () => {
cart.push(keyboard);
};
const getDiscount = (cart) => {
if (cart.length < 1) {
console.log("Please add an item");
}
if (cart.length === 1) {
disc_amount = keyboard.reg_price * discFor1;
} else if (cart.length === 2) {
disc_amount = keyboard.reg_price * discFor2;
} else if (cart.length === 3) {
disc_amount = keyboard.reg_price * discFor3;
} else if (cart.length === 4) {
disc_amount = keyboard.reg_price * discFor4;
} else if (cart.length === 5) {
disc_amount = keyboard.reg_price * discFor5;
} else if (cart.length === 6) {
disc_amount = keyboard.reg_price * discFor6;
} else if (cart.length > 6) {
disc_amount = keyboard.reg_price * discFor6;
}
return disc_amount;
};
const getTotalAmount = (disc_amount, cart) => {
let total_reg_price_amount = 0;
for (let i = 0; i < cart.length; i++) {
total_reg_price_amount += cart[i].reg_price;
}
total_amount = total_reg_price_amount - disc_amount;
return total_amount;
};
addKeyboardToCart();
addKeyboardToCart();
addKeyboardToCart();
addKeyboardToCart();
addKeyboardToCart();
addKeyboardToCart();
getDiscount(cart);
getTotalAmount(disc_amount, cart);

编辑:我也在尝试实现如何为客户获得最佳折扣,这就是为什么我试图动态应用折扣,而不是为每个订购的项目数量硬编码折扣金额。

编辑:我修改了我的问题,删除了额外的问题,这样答案就可以更集中在一个具体的问题上。

我将问题简化了一点,但保持了您所遵循的相同逻辑:

我还添加了一个小的测试函数来测试你想要的所有情况下的函数。我已经加了一些。如果你愿意,可以添加更多。

编辑添加:如何计算totalPrice并添加更多的测试用例

keyboard = {
reg_price: 200
}
const discFor1 = 0.20
const discFor2 = 0.30
const discFor3 = 0.40
const getDiscount = (cart_length) => {
switch ( cart_length ) {
case 1 : return keyboard.reg_price * discFor1;
case 2 : return keyboard.reg_price * 2 * discFor2;
case 3 : return keyboard.reg_price * 3 * discFor3;
case 4 : return keyboard.reg_price * 3 * discFor3 + keyboard.reg_price * discFor1;
case 5 : return keyboard.reg_price * 3 * discFor3 + keyboard.reg_price * 2 * discFor2;
default : return keyboard.reg_price * 6 * discFor3;
}
};
const getTotalAmount = (cart) => {
if (cart.length == 0) {
console.log("Please add an item")
return;
}
total_amount = cart.length * keyboard.reg_price - getDiscount(cart.length);
return total_amount;
};
const test = ( cart, ans ) => {
if ( getTotalAmount(cart) !== ans) {
console.log(`Error: expected ${ans}, received ${getTotalAmount(cart)}`)
} else {
console.log(`Success: expected ${ans}, received ${getTotalAmount(cart)}`)
}
}
test([], undefined)
test(["keybd"], 200 - 40)
test(["keybd", "keybd"], 400 - 120)
test(["keybd", "keybd", "keybd"], 600 - 240)
test(["keybd", "keybd", "keybd", "keybd"], 800 - 280)
test(["keybd", "keybd", "keybd", "keybd", "keybd"], 1000 - 360)
test(["keybd", "keybd", "keybd", "keybd", "keybd", "keybd"], 1200 - 480)
test(["keybd", "keybd", "keybd", "keybd", "keybd", "keybd", "keybd"], 1400 - 480)
test(["keybd", "keybd", "keybd", "keybd", "keybd", "keybd", "keybd", "keybd"], 1600 - 480)

最新更新