Как упростить код при помощи функций?

const products = [
    {name: 'Apple', price: 20},
    {name: 'Cherry', price: 10},
    {name: 'Banana', price: 15},
    {name: 'Orange', price: 25},
    {name: 'Lemon', price: 17},
    {name: 'Pear', price: 30}
];

const GRN_PER_DOLLAR = 41;
const DISCOUNT_START_FROM = 10000;
const DISCOUNT = 20;

for (let prodId = 0;prodId < products.length;prodId++) {
    console.log(`${prodId + 1} ${products[prodId].name} ${products[prodId].price}`);
}

let prodNum;

do {
    prodNum = prompt('Write product number:');

    if (prodNum === null) {
        break;
    }
    prodNum--;
} while (prodNum < 0 || prodNum > products.length - 1 || isNaN(prodNum));

if (typeof prodNum === 'number') {
    const product = products[prodNum];

    console.log(product);

    let prodCount;

    do {
        prodCount = prompt('Write product count:');

        if (prodCount === null) {
            break;
        }
        prodCount = +prodCount;
    } while(prodCount <= 0 || isNaN(prodCount));

    if (typeof prodCount === 'number') {
        const totalProdPrice = prodCount * product.price;

        console.log(`Total price: $${totalProdPrice}`);

        if (totalProdPrice * GRN_PER_DOLLAR > DISCOUNT_START_FROM) {
            console.log(`Congrats, you get a discount ${DISCOUNT}%`);
            console.log(`Your total price is: ${totalProdPrice * (100 - DISCOUNT) / 100}`);
        }
    }
}

Есть такой код, как его упростить и уменьшить при помощи функций. (кому не лень покажите как это должно выглядеть)


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

Автор решения: SwaD

Для упрощения кода при помощи функций, вынесем в функции повторяющийся код и пытаемся сгруппировать однотипные операции.

В примере ниже, все запросы данных от пользователя вынесены в отдельную функцию. Чтоб бы ее унифицировать, созданы 2 фукнции с проверками.

const products = [
  {name: 'Apple', price: 20},
  {name: 'Cherry', price: 10},
  {name: 'Banana', price: 15},
  {name: 'Orange', price: 25},
  {name: 'Lemon', price: 17},
  {name: 'Pear', price: 30}
];

const GRN_PER_DOLLAR = 41;
const DISCOUNT_START_FROM = 10000;
const DISCOUNT = 20;

for (let prodId = 0; prodId < products.length; prodId++) {
  console.log(`${prodId + 1} ${products[prodId].name} ${products[prodId].price}`);
}
// Условия на наличие товара
function conditionNum(num) {
  return num < 1 || num > products.length;
}
// Условия на количество товара
function conditionCount(num) {
  return num <= 0;
}
// Функция запрашивает данные у клиента и проверяет их
function answerClient(textAnswer, condition) {
  let answer;
  do {
    answer = Number(prompt(textAnswer)); // Сразу преобразуем к числу
    if (!answer) {
      break;
    }
  } while (condition(answer))
  return answer;
}
// Получаем товар
const product = products[answerClient('Write product number:', conditionNum) - 1];
console.log(product);
// Получаем количество
const prodCount = answerClient('Write product count:', conditionCount);

const totalProdPrice = prodCount * product.price;
console.log(`Total price: $${totalProdPrice}`);

if (totalProdPrice * GRN_PER_DOLLAR > DISCOUNT_START_FROM) {
  console.log(`Congrats, you get a discount ${DISCOUNT}%`);
  console.log(`Your total price is: ${totalProdPrice * (100 - DISCOUNT) / 100}`);
}

Если идея с передачей функций в качестве параметра не понятна или не нравится, можно переписать функцию answerClient вот так:

function answerClient(textAnswer, type) {
  let answer;
  do {
    answer = Number(prompt(textAnswer)); // Сразу преобразуем к числу
    if (!answer) {
      break;
    }
  } while (type === 'product' ? conditionNum(answer) : conditionCount(answer))
  return answer;
}

И вызывать ее соответственно

const product = products[answerClient('Write product number:', 'product') - 1];
const prodCount = answerClient('Write product count:', 'count');
→ Ссылка