Подсчёт общей цены товаров с применением скидки

Для каждого товара примените процент его категории, затем сложите обычные и сниженные цены. В примере 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 })) };
}

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

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее