Для каждого товара примените процент его категории, затем сложите обычные и сниженные цены. В примере 20 × 0,9 + 20 × 0,7 = 32; имя вызова нужно исправить на calculateTotal.
Подсчёт общей цены товаров с применением скидки
Для каждого товара примените процент его категории, затем сложите обычные и сниженные цены. В примере 20 × 0,9 + 20 × 0,7 = 32; имя вызова нужно исправить на calculateTotal.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Создайте функцию, получающую массив объектов‑товаров и объект‑скидку, которая вычислит итоговую стоимость покупок с учётом предоставленных скидок.
function calculateTotal(products, discount) {}
const discountPercentage = { fruit: 10, vegetable: 30 };
const result = calculatedTotal(products, discountPercentage);
console.log("receipt", result);
// "receipt", {
"totalWithoutDiscount": 40,
"totalWithDiscount": 32,
"discount": {
"fruit": 10,
"vegetable": 30
},
"items": [
{
"id": 1123,
"price": 20,
"name": "apple",
"color": "red",
"category": "fruit"
},
{
"id": 4322,
"price": 20,
"name": "apple",
"ferm": "siberia",
"category": "vegetable"
}
]
}
Ответ
Для каждого товара примените процент его категории, затем сложите обычные и сниженные цены. В примере 20 × 0,9 + 20 × 0,7 = 32; имя вызова нужно исправить на calculateTotal.
function calculateTotal(products, discount) {
let full = 0, reduced = 0;
for (const product of products) {
const rate = Object.hasOwn(discount, product.category) ? discount[product.category] : 0;
if (!Number.isFinite(product.price) || product.price < 0 ||
!Number.isFinite(rate) || rate < 0 || rate > 100) throw new RangeError('Некорректная цена или скидка');
const cents = Math.round(product.price * 100);
full += cents;
reduced += Math.round(cents * (100 - rate) / 100);
}
return { totalWithoutDiscount: full / 100, totalWithDiscount: reduced / 100,
discount: { ...discount }, items: products.map(item => ({ ...item })) };
}
Каждая строка считается одной единицей товара, отсутствующая скидка — нулевой. Округление здесь выполняется до копейки для каждой позиции. В реальной системе лучше принимать исходные цены целыми копейками и явно ограничивать суммы безопасным диапазоном.