@anton_trofimov95

Как вычислять скидку в зависимости от суммы?

Сделал подобную вещь, но не работает:

var a = 4000;
var b = 10000;
var c = 20000;
var d = 50000;
var pricechange = {$p.price};
if (a < pricechange < b) {
 document.write ('pricechange*0.98');
} 
 else if (b < pricechange < c) {
 document.write ('pricechange*0.97');
}
 else if (c < pricechange < d) {
 document.write ('pricechange*0.96');
}
 else {(d < pricechange){
 document.write ('pricechange*0.95');
}

Логика такая: есть цены и скидки. Если до 4000, ее нет, если от 4000 и до 10000 - 2% ну и так далее. Переменная {$p.price} взята из php шаблона, ради чего собственно это все делается. Как поправить код?
  • Вопрос задан
  • 715 просмотров
Решения вопроса 2
0xD34F
@0xD34F Куратор тега JavaScript
Как поправить код?

Такой код не правят, а переписывают.

Сделаем табличку со скидками:

const discounts = [
  { percent: 0, sum: 0 },
  { percent: 2, sum: 4000 },
  { percent: 3, sum: 10000 },
  { percent: 4, sum: 20000 },
  { percent: 5, sum: 50000 },
];

Получим скидку:

const discount = discounts.reduce((p, c) => c.sum <= pricechange ? c : p);

Посчитаем цену со скидкой:

const discountedPrice = pricechange * (100 - discount.percent) / 100;

UPD. В комментариях было высказано мнение, будто показывать reduce автору вопроса, который вроде как начинающий - типа нехорошо. Слишком сложно? Давайте сделаем проще.

Вместо суммы, на которой начинается действие скидки, будем работать с суммой, на которой скидка действовать перестаёт:

const discounts = [
  { percent: 0, sum: 4000 },
  { percent: 2, sum: 10000 },
  { percent: 3, sum: 20000 },
  { percent: 4, sum: 50000 },
  { percent: 5, sum: Infinity },
];

В этом случае нужная скидка - первая, чья граница превышает проверяемую сумму:

const discount = discounts.find(n => n.sum > pricechange);
Ответ написан
Vlad_IT
@Vlad_IT Куратор тега JavaScript
Front-end разработчик
Так и пишете
var a = 4000;
var b = 10000;
var c = 20000;
var d = 50000;
var pricechange = {$p.price};
if (a <= pricechange && pricechange  < b) { // используем строгое равенство для от
 pricechange *= 0.98;
} 
 else if (b <= pricechange && pricechange  < c) {
 pricechange *= 0.97;
}
 else if (c <= pricechange && pricechange  < d) {
 pricechange *= 0.96;
}
 else  {
 pricechange *= 0.95;
}

Используйте строгое равенство, иначе если будет 4000, 10000, 20000, 50000, то оно не попадет в условия.
У вас вот это неправильно
else {(d < pricechange){
 document.write ('pricechange*0.95');
}

либо пишите else if, либо просто else, т.к. из предыдущего условия понятно, что pricechange больше или равно d.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@Azperin
Дилетант
Могу предложить такой вариант

var discount = function(price) {
	return 	
			/^[4-9]{1}[0-9]{3}$/.test(price) ? price * 0.98 : 
			/^1[0-9]{4}$/.test(price) ? price * 0.97 : 
			/^2[0-9]{4}$/.test(price) ? price * 0.96 : 
			/^5[0-9]{4}$/.test(price) ? price * 0.95 : 
			price;
}
Ответ написан
Комментировать
@anton_trofimov95 Автор вопроса
Владимир Проскурин сейчас напишу и попробую. Дело в том, что webasyst не пропускает сторонние php файлы, сначала код на php был такой
$arr = array(4000 => 0.98, 10000 => 0.97, 20000 => 0.96, 50000 => 0.95);
$skidka = 1;
foreach ($arr as $k => $v) { if ($p.price >= $k} $skidka = $v; }
$e = {shop_currency_html($p.price)} * $skidka;
echo($e);
, но его не удалось вставить, теги {php}{/php}не позволяет, и там в корень не залезть, сайт в облаке webasysta

почему то в ветке комментов уже не могу ответить
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы