Функцию на js, которая вычисляет и возвращает стоимость корзины товаров после применения всех скидок

Необходимо написать функцию, которая вычисляет и возвращает стоимость корзины товаров после применения всех скидок. В качестве аргументов функция принимает 3 параметра:

Общая сумма корзины Количество товаров в корзине Промокод (по умолчанию null) Правила и порядок (порядок важен!) начисления скидок:

Если промокод равен 'ДАРИМ300', то из суммы вычитается 300 рублей. При этом если сумма меньше 300 рублей, то итоговая стоимость будет 0. При количестве товаров в корзине ≥10 применяется скидка 5% ко всей сумме При сумме, превышающей 50 000, применяется скидка 20% к сумме превышения (то есть к разнице суммы корзины и 50 000) Если промокод равен 'СКИДКА15', то ко всей сумме применяется скидка 15%, но только если сумма ≥20 000 Каждая следующая скидка должна проверяться и применяться к сумме после применения предыдущих скидок.

function cart(basketAmount, countGoods, promo = null) {

    if (promo = 'ДАРИМ300' && basketAmount < 300) {
        totalAmount = 0;
        console.log('Стоимость равна ' + totalAmount);
    } else if (promo = 'ДАРИМ300') {
        const totalAmount = basketAmount - 300;
        console.log('Стоимость равна ' + totalAmount);
    } else if (countGoods >= 10) {
        const countFiveProcent = basketAmount/100*5;
        totalAmount = basketAmount - countFiveProcent;
        console.log('Стоимость равна ' + totalAmount);
    } else if (basketAmount > 50000) {
        const countTwentyProcent = basketAmount/100*20;
        const countDifference = basketAmount - 50000;
        totalAmount = countDifference - countTwentyProcent;
        console.log('Стоимость равна ' + totalAmount);
    } else if (promo = 'СКИДКА15' && basketAmount >= 20000) {
        const countFifteenProcent = basketAmount/100*15;
        totalAmount = basketAmount - countFifteenProcent;
        console.log('Стоимость равна ' + totalAmount);
    }

}

cart(1000, 2, 'ДАРИМ300');

Ответы (3 шт):

Автор решения: Олег

Как работают сами функции скидок я не смотрел, у вас ошибка в логике. Операторы else if работают по очереди, но если условие соблюдено — дальше программа не идет. Вам нужно разбить проверку каждой скидку отдельно, а также каждый раз пересчитывать total, чтобы каждая последующая скидка считалась от предыдущей. примерно такой layout будет:

console.clear();

function cart(basketAmount, countGoods, promo = null) {
  let totalAmount = basketAmount;

  if (promo = 'ДАРИМ300' && basketAmount < 300) {
    totalAmount = 0;
    console.log('ДАРИМ300 ' + totalAmount);
  } else if (promo = 'ДАРИМ300') {
    totalAmount -= 300;
    console.log('ДАРИМ300 ' + totalAmount);
  }
  
  if (countGoods >= 10) {
    const countFiveProcent = basketAmount/100*5;
    totalAmount -= countFiveProcent;
    console.log('больше 10 товаров ' + totalAmount);
  }
  
  if (basketAmount > 50000) {
    const countTwentyProcent = totalAmount/100*20;
    const countDifference = totalAmount - 50000;
    totalAmount = countDifference - countTwentyProcent;
    console.log('больше 50 000 ₽ ' + totalAmount);
  }
  
  if (promo = 'СКИДКА15' && basketAmount >= 20000) {
    const countFifteenProcent = totalAmount/100*15;
    totalAmount -= countFifteenProcent;
    console.log('СКИДКА15 ' + totalAmount); 
  }
  console.log('Стоимость равна ' + totalAmount);
}

cart(100000, 12, 'ДАРИМ300');

→ Ссылка
Автор решения: Нагибаю ТвоиМечты

Как то так, вроде все сходится. Оставлю тут на всякий случай)

let price = 0;
calculate(21000, 12, 'СКИДКА15');

function calculate(amount, products, promo = null) { 
    //  console.log(amount, products, promo);
    let basketAmount = amount;

            // промокод равен 'ДАРИМ300'
  if (promo === 'ДАРИМ300' && basketAmount > 300) {
   basketAmount -= 300;
//    console.log('basket -300', basketAmount);
} else  if (promo === 'ДАРИМ300' && basketAmount < 300) {
   basketAmount = 0;
//    console.log('basket < 300, = 0', basketAmount);
}
            // товаров в корзине ≥10 
    if (products >= 10) {
        let discontFive = basketAmount * 5 / 100;
       basketAmount -= discontFive;
    //    console.log('basket -5%', basketAmount);
    } 

            // сумма, превышающая 50 000, -20%
    if (basketAmount >= 50000) {
       let discountTwentyDifference = (basketAmount - 50000) * 20 / 100;
      basketAmount -= discountTwentyDifference;
    //   console.log('basket -20%', basketAmount);
    } 

            // промокод равен 'СКИДКА15', если сумма ≥20 000
    if (basketAmount >= 20000 && promo === 'СКИДКА15') {
        let discontFifteen = basketAmount * 15 / 100;
       basketAmount -= discontFifteen;
    //    console.log('basket -15%', basketAmount);
    }

    // console.log(basketAmount);
    return price = basketAmount;
} // end function

console.log('Cтоимость корзины: ', price);

→ Ссылка
Автор решения: Виталий Нагаев
function calculate(value, products, promo) {

 let finalAmount = value;
 if (promo == 'ДАРИМ300') {
   if (finalAmount <= 300) {
     finalAmount = 0;
    } else {
      finalAmount -= 300;
  }
}

  if (products >= 10) {
    finalAmount *= 0.95;
  }

  if (finalAmount > 50000) {
    finalAmount = 50000 + (finalAmount - 50000) * 0.8;
  }

  if (promo == 'СКИДКА15') {
    if (finalAmount >= 20000) {
      finalAmount *= 0.85;
    }
  }
  return finalAmount;
}

calculate();

export default calculate;
→ Ссылка