24.10.2021, 17:08
|
Аспирант
|
|
Регистрация: 24.10.2021
Сообщений: 31
|
|
Помогите собрать функцию скидки
Добрый день! такая задача
Напишите функцию, которая вычисляет и возвращает стоимость корзины товаров после применения всех скидок. В качестве аргументов функция принимает 3 параметра:
Общая сумма корзины
Количество товаров в корзине
Промокод (по умолчанию null)
Правила и порядок (порядок важен!) начисления скидок:
Если промокод равен 'ДАРИМ300', то из суммы вычитается 300 рублей. При этом если сумма меньше 300 рублей, то итоговая стоимость будет 0.
При количестве товаров в корзине ≥10 применяется скидка 5% ко всей сумме
При сумме, превышающей 50 000, применяется скидка 20% к сумме превышения (то есть к разнице суммы корзины и 50 000)
Если промокод равен 'СКИДКА15', то ко всей сумме применяется скидка 15%, но только если сумма ≥20 000
нужно реализовать этот пункт задачи
-------------Каждая следующая скидка должна проверяться и применяться к сумме после применения предыдущих скидок.>------------------------
function cart(basketAmount, countGoods, promo = null) {
let discountAmount = 0;
let discountPercent = 0;
let rules = [
() => { if (promo === "ДАРИМ300") discountAmount += 300; },
() => { if (countGoods >= 10) discountPercent += 5; },
() => { if (basketAmount > 50000) discountAmount += (basketAmount - 50000) * 0.2 },
() => { if (promo === "СКИДКА15" && basketAmount >= 20000) discountPercent += 15; }
];
for (let f of rules) f();
let result;
if (discountPercent >= 100) result = 0;
else result = basketAmount * (100 - discountPercent) / 100 - discountAmount;
if (result < 0) result = 0;
console.log(discountAmount, discountPercent);
return result;
}
console.log(cart(80000, 20, "СКИДКА15"));
export default cart
буду признателен за помощь в решении
|
|
24.10.2021, 19:26
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,121
|
|
TomWalbridge,
function cart(basketAmount, countGoods, promo = null) {
let discountAmount = 0;
let rules = [
() => {
if (promo === "ДАРИМ300") discountAmount += 300;
},
() => {
if (countGoods >= 10) discountAmount += basketAmount * .05;
},
() => {
if (basketAmount > 50000) discountAmount += (basketAmount - 50000) * 0.2;
},
() => {
if (promo === "СКИДКА15" && basketAmount >= 20000) discountAmount += basketAmount * 0.15;
}
];
for (let f of rules) f();
let result = Math.max(0, basketAmount - discountAmount);
return result;
}
console.log(cart(80000, 20, "СКИДКА15"));
|
|
24.10.2021, 19:26
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,121
|
|
Пожалуйста, отформатируйте свой код!
Для этого его можно заключить в специальные теги: js/css/html и т.п., например:
[html run]
... минимальный код страницы с вашей проблемой
[/html]
О том, как вставить в сообщение исполняемый javascript и html-код, а также о дополнительных возможностях форматирования - читайте http://javascript.ru/formatting.
|
|
24.10.2021, 20:15
|
Аспирант
|
|
Регистрация: 24.10.2021
Сообщений: 31
|
|
по сути дела код работал, но в подсчете стоимости корзины не учитываются предыдущие скидки, так как берётся только начальная стоимость корзины, а надо учитывать стоимость корзины с применением скидок, вот как это исправить?
Код вроде отформатировал..
function cart(basketAmount, countGoods, promo = null) {
02
let discountAmount = 0;
03
let rules = [
04
() => {
05
if (promo === "ДАРИМ300") discountAmount += 300;
06
},
07
() => {
08
if (countGoods >= 10) discountAmount += basketAmount * .05;
09
},
10
() => {
11
if (basketAmount > 50000) discountAmount += (basketAmount - 50000) * 0.2;
12
},
13
() => {
14
if (promo === "СКИДКА15" && basketAmount >= 20000) discountAmount += basketAmount * 0.15;
15
}
16
];
17
for (let f of rules) f();
18
let result = Math.max(0, basketAmount - discountAmount);
19
return result;
20
}
21
22
console.log(cart(80000, 20, "СКИДКА15"));
|
|
24.10.2021, 20:19
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,121
|
|
TomWalbridge,
|
|
24.10.2021, 21:04
|
|
Профессор
|
|
Регистрация: 03.02.2020
Сообщений: 2,750
|
|
Так можно сделать
function cart(basketAmount, countGoods, promo = null) {
let discountAmount = 0;
let rules = [
(result) => {
return (promo === "ДАРИМ300")? result - 300 : result;
},
(result) => {
return (countGoods >= 10)? result * 0.95 : result;
},
(result) => {
return (result > 50000)? result - (50000 - result) * 0.2 : result
},
(result) => {
return (promo === "СКИДКА15" && result >= 20000)? result * 0.85 : result;
}
];
let result = basketAmount;
for (let f of rules) {
result = f(result);
if (result <= 0) {
result = 0;
break;
}
}
return result;
}
console.log(cart(80000, 20, "СКИДКА15")); // 69020 А сколько должно быть?
Последний раз редактировалось voraa, 24.10.2021 в 21:10.
|
|
24.10.2021, 22:03
|
Аспирант
|
|
Регистрация: 24.10.2021
Сообщений: 31
|
|
просто как я понял, надо записать в переменную изначальную стоимость корзины, потом применить к сумме скидки и уменьшать это число, но как реализовать не совсем пойму и где
|
|
25.10.2021, 09:06
|
|
CacheVar
|
|
Регистрация: 19.08.2010
Сообщений: 14,225
|
|
voraa, в твоем алгоритме все время уменьшается result...
Т.о. и получаются такие казусы
Цитата:
|
Сумма заказа 2050р. При заказе больше 2000р предусмотрена скидка 100р.
К оплате 1950р.
При заказе менее 2000р доставка платная. Цена доставки по вашему адресу 600р.
Итого к оплате 2550р.
|
Т.е. все блага должны анализироваться "от первоначальной" суммы. Все скидки суммируются и только по по окончании всех рассчетов происходит вычитание размера скидок из основной суммы.
|
|
25.10.2021, 12:12
|
Аспирант
|
|
Регистрация: 24.10.2021
Сообщений: 31
|
|
собственно, это я и хочу понять как сделать, если есть идеи как написать эту функцию, буду признателен!?
|
|
25.10.2021, 13:23
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,121
|
|
TomWalbridge,
чем вариант #2 не устраивает?
|
|
|
|