Напишите функцию calculate() , которая вычисляет и возвращает стоимость корзины товаров после применения всех скидок

Рейтинг: 0Ответов: 2Опубликовано: 06.02.2023

В качестве аргументов функция принимает 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 если сумма не подходит к условию то скидка не применялась?

Ответы

▲ 1Принят

Можно сумму считать на "лету", а не пытаться агрегировать скидки и потом их применять:

/**
 *
 * @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'))

▲ 0
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;