Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 24.10.2021, 17:08
Аспирант
Отправить личное сообщение для TomWalbridge Посмотреть профиль Найти все сообщения от TomWalbridge
 
Регистрация: 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


буду признателен за помощь в решении
Ответить с цитированием
  #2 (permalink)  
Старый 24.10.2021, 19:26
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,109

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"));
Ответить с цитированием
  #3 (permalink)  
Старый 24.10.2021, 19:26
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,109

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

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

О том, как вставить в сообщение исполняемый javascript и html-код, а также о дополнительных возможностях форматирования - читайте http://javascript.ru/formatting.
Ответить с цитированием
  #4 (permalink)  
Старый 24.10.2021, 20:15
Аспирант
Отправить личное сообщение для TomWalbridge Посмотреть профиль Найти все сообщения от TomWalbridge
 
Регистрация: 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"));
Ответить с цитированием
  #5 (permalink)  
Старый 24.10.2021, 20:19
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,109

TomWalbridge,
Ответить с цитированием
  #6 (permalink)  
Старый 24.10.2021, 21:04
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,744

Так можно сделать
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.
Ответить с цитированием
  #7 (permalink)  
Старый 24.10.2021, 22:03
Аспирант
Отправить личное сообщение для TomWalbridge Посмотреть профиль Найти все сообщения от TomWalbridge
 
Регистрация: 24.10.2021
Сообщений: 31

просто как я понял, надо записать в переменную изначальную стоимость корзины, потом применить к сумме скидки и уменьшать это число, но как реализовать не совсем пойму и где
Ответить с цитированием
  #8 (permalink)  
Старый 25.10.2021, 09:06
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,215

voraa, в твоем алгоритме все время уменьшается result...
Т.о. и получаются такие казусы
Цитата:
Сумма заказа 2050р. При заказе больше 2000р предусмотрена скидка 100р.
К оплате 1950р.
При заказе менее 2000р доставка платная. Цена доставки по вашему адресу 600р.
Итого к оплате 2550р.
Т.е. все блага должны анализироваться "от первоначальной" суммы. Все скидки суммируются и только по по окончании всех рассчетов происходит вычитание размера скидок из основной суммы.
Ответить с цитированием
  #9 (permalink)  
Старый 25.10.2021, 12:12
Аспирант
Отправить личное сообщение для TomWalbridge Посмотреть профиль Найти все сообщения от TomWalbridge
 
Регистрация: 24.10.2021
Сообщений: 31

собственно, это я и хочу понять как сделать, если есть идеи как написать эту функцию, буду признателен!?
Ответить с цитированием
  #10 (permalink)  
Старый 25.10.2021, 13:23
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,109

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



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Получить имя функции внутри функции не используя callee drwhite Общие вопросы Javascript 39 12.02.2020 22:48
Помогите дописать функцию, чтобы ajax запрос не возвращал [object Object] Artur_Hopf Общие вопросы Javascript 5 26.04.2019 07:32
Помогите с событиями Forgotten Элементы интерфейса 3 03.09.2012 13:29
Помогите с javascript andruhin Общие вопросы Javascript 12 04.05.2012 10:05
Помогите из разрозненного собрать целое str07str Общие вопросы Javascript 0 22.07.2011 12:02