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 не устраивает?


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