Напишите функцию calculate() , которая вычисляет и возвращает стоимость корзины товаров после применения всех скидок
В качестве аргументов функция принимает 3 параметра:
1)Общая сумма корзины
2)Количество товаров в корзине
3)Промокод (по умолчанию null)
Правила и порядок (порядок важен!) начисления скидок:
1)Если промокод равен 'ДАРИМ300', то из суммы вычитается 300 рублей. При этом если сумма меньше 300 рублей, то итоговая стоимость будет 0.
2)При количестве товаров в корзине ≥10 применяется скидка 5% ко всей сумме
3)При сумме, превышающей 50 000, применяется скидка 20% к сумме превышения (то есть к разнице суммы корзины и 50 000)
4)Если промокод равен 'СКИДКА15', то ко всей сумме применяется скидка 15%, но только если сумма ≥20 000 Каждая следующая скидка должна проверяться и применяться к сумме после применения предыдущих скидок.
function calculate(basketAmount, countGoods, promo = null) {
let discountAmount = 0;
let discountPercent = 0;
let totalAmount = basketAmount;
let rules = [
() => { if (promo === "ДАРИМ300") discountAmount += 300; },
() => { if (countGoods >= 10) discountPercent += 5; },
() => { if (totalAmount > 50000) discountAmount += (basketAmount - 50000) * 0.2 },
() => { if (promo === "ДАРИМ300" && totalAmount > 50000) discountAmount += 300 ((basketAmount - 50000) * 0.2 ) },
() => { if (promo === "СКИДКА15" && basketAmount >= 20000) discountPercent += 15; }
];
for (let f of rules) f();
if (discountPercent >= 100) totalAmount = 0;
else totalAmount = (basketAmount - discountAmount) * ((100 - discountPercent) / 100);
if (totalAmount < 0) totalAmount = 0;
return totalAmount;
}
Как мне сделать так что бы проценты не складывались и после учета discountAmount если сумма не подходит к условию то скидка не применялась?
Ответы (2 шт):
Можно сумму считать на "лету", а не пытаться агрегировать скидки и потом их применять:
/**
*
* @param {number} basketAmount
* @param {number} countGoods
* @param {string | null} [promo]
* @return {number}
*/
function calculate(basketAmount, countGoods, promo = null) {
let totalAmount = basketAmount;
let rules = [
() => {
if (promo === "ДАРИМ300") totalAmount = totalAmount > 300 ? totalAmount - 300 : 0;
},
() => {
if (countGoods >= 10) totalAmount *= 0.95;
},
() => {
if (totalAmount > 50000) totalAmount = 50000 + (totalAmount - 50000) * 0.8;
},
() => {
if (promo === "СКИДКА15" && totalAmount >= 20000) totalAmount *= 0.85;
}
];
for (let f of rules) f();
return totalAmount;
}
console.log(calculate(5000, 6))
console.log(calculate(5000, 6, 'ДАРИМ300'))
console.log(calculate(50000, 6, 'ДАРИМ300'))
console.log(calculate(100000, 16, 'ДАРИМ300'))
console.log(calculate(40000, 16, 'СКИДКА15'))
function calculate(totalPrice, quantityGoods, promo = null) {
let totalAmount = totalPrice; {
if (promo === "ДАРИМ300") totalAmount = totalAmount > 300 ? totalAmount - 300 : 0;
if (quantityGoods >= 10) totalAmount *= 0.95;
if (totalAmount > 50000) totalAmount = 50000 + (totalAmount - 50000) * 0.8;
if (promo === "СКИДКА15" && totalAmount >= 20000) totalAmount *= 0.85;
}
return totalAmount;
}
export default calculate;