Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   Помогите собрать функцию скидки (https://javascript.ru/forum/dom-window/83240-pomogite-sobrat-funkciyu-skidki.html)

TomWalbridge 24.10.2021 17:08

Помогите собрать функцию скидки
 
Добрый день! такая задача
Напишите функцию, которая вычисляет и возвращает стоимость корзины товаров после применения всех скидок. В качестве аргументов функция принимает 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

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

Пожалуйста, отформатируйте свой код!

Для этого его можно заключить в специальные теги: js/css/html и т.п., например:
[html run]
... минимальный код страницы с вашей проблемой
[/html]

О том, как вставить в сообщение исполняемый javascript и html-код, а также о дополнительных возможностях форматирования - читайте http://javascript.ru/formatting.

TomWalbridge 24.10.2021 20:15

по сути дела код работал, но в подсчете стоимости корзины не учитываются предыдущие скидки, так как берётся только начальная стоимость корзины, а надо учитывать стоимость корзины с применением скидок, вот как это исправить?
Код вроде отформатировал..
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

TomWalbridge,
:-?

voraa 24.10.2021 21:04

Так можно сделать
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 А сколько должно быть?

TomWalbridge 24.10.2021 22:03

просто как я понял, надо записать в переменную изначальную стоимость корзины, потом применить к сумме скидки и уменьшать это число, но как реализовать не совсем пойму и где

ksa 25.10.2021 09:06

voraa, в твоем алгоритме все время уменьшается result... :(
Т.о. и получаются такие казусы
Цитата:

Сумма заказа 2050р. При заказе больше 2000р предусмотрена скидка 100р.
К оплате 1950р.
При заказе менее 2000р доставка платная. Цена доставки по вашему адресу 600р.
Итого к оплате 2550р.
Т.е. все блага должны анализироваться "от первоначальной" суммы. Все скидки суммируются и только по по окончании всех рассчетов происходит вычитание размера скидок из основной суммы.

TomWalbridge 25.10.2021 12:12

собственно, это я и хочу понять как сделать, если есть идеи как написать эту функцию, буду признателен!?

рони 25.10.2021 13:23

TomWalbridge,
чем вариант #2 не устраивает?

ksa 25.10.2021 13:40

Цитата:

Сообщение от TomWalbridge
если есть идеи как написать эту функцию, буду признателен!?

Тебе все эти "идеи" уже показали выше...
Небольшая модификация примера от voraa будет суммировать скидки от "основной суммы"...

ksa 25.10.2021 13:46

Цитата:

Сообщение от TomWalbridge
Каждая следующая скидка должна проверяться и применяться к сумме после применения предыдущих скидок.

Тогда voraa тебе все правильно написал. Все как ты и просил ранее.

ksa 25.10.2021 13:48

TomWalbridge, если не умеешь объяснять - так хоть приведи примеры расчета на каких-то примерах...

voraa 25.10.2021 17:42

Цитата:

Сообщение от ksa
Т.е. все блага должны анализироваться "от первоначальной" суммы. Все скидки суммируются и только по по окончании всех рассчетов происходит вычитание размера скидок из основной суммы.

Может быть.
Но я так понял
Цитата:

Сообщение от TomWalbridge
но в подсчете стоимости корзины не учитываются предыдущие скидки, так как берётся только начальная стоимость корзины, а надо учитывать стоимость корзины с применением скидок, вот как это исправить?

В принципе это вариант позволяет и использовать начальную стоимость

Хуже бы было при условии, что какие то скидки не суммируются, а просто применяется максимальная.

TomWalbridge 27.10.2021 11:03

Да, спасибо, он самый, сразу не заметил!)


Часовой пояс GMT +3, время: 17:36.