Подскажите как оптимизировать код

Menro

web, seo, email, hack
Регистрация
27 Янв 2008
Сообщения
689
Реакции
138
Всем привет!
Сегодня на сайте пришлось сделать небольшой калькулятор товаров, всё получилось, всё работает. Но я столкнулся с проблемой, что каждый элемент я указываю явно. Мой код заточен под 2 товара и если их будет 3, то он работать не будет.
Связи с этим прошу помощи с оптимизацией кода таким образом, что не ему было не важно сколько товаров будет.

PHP:
var quantity = []; //массив куда указывается общее количество товаров которые хочет купить человек (штуки)
var prices = [];  // массив который хранит все цены на выбранные товары

//Собственно записываем в массив цены
jQuery('input[name="price"]').each(function( index ) {
    quantity.push(jQuery( this ).val());
});
//И количество
jQuery('.item .amount').each(function( index ) {
    prices.push(jQuery( this ).text().replace(/[^0-9]/g, ''));
});

//Далее я горожу вот такой огород. Обращаюсь к первому товару через quantity[0] - беру количество заказываемое, затем беру prices[0] (цену за этот товар) и перемножаю в total_price_item_1.

//тут обращаюсь с конкретным индексам и беду количество и суммы
var quantity_1 = quantity[0];
var quantity_2 = quantity[1];
var prices_1 = prices[0];
var prices_2 = prices[1];

//Здесь всё перемножаю и вывожу итоговую сумму.
var total_price_item_1 = parseInt(quantity_1)*parseInt(prices_1);
var total_price_item_2 = parseInt(quantity_2)*parseInt(prices_2);
var total_price = total_price_item_1+total_price_item_2;
var total_quantity = parseInt(quantity_1)+parseInt(quantity_2);


//Тут уже вывод
jQuery('.price-total').empty();
jQuery('.price-total').append(thousandSeparator(total_price) + ' ₽');
jQuery('.day-total').empty();
jQuery('.day-total').append(total_quantity + ' шт.');
        }
        calc();
    jQuery('input[name="price"]').change(function() {
calc();

});

Вообщем мне надо как-то два массива между собой посчитать.
Возможно вообще как-то в один массив объединить.
Короче опыта не хватает, не пойму как правильно сделать.
Признателен за любую помощь.
 
Что то из сказанного будет оффтоп, что то будет надеюсь полезно.
1) jQuery - зло, да ладно. Не имея перед глазами готового DOM (примера разметки хотя бы) - сложно конкретизировать пример. НО перебор товара по отдельности цена / количество и все это в массив - это вероятность в будущем допустить оплошность / просчет при переборе, когда цена по индексу при переборе не будет соответствовать кол-ву. Я бы рекомендовал использовать ключ / значений (аля хэш-таблицу) с исп. объекта, пример:
Код:
const storage = {}; // Общий стор (ключ / значение), где ключ может быть какой либо идентификатор товара

// Занимаемся перебором
jQuery('.item').each(() => {
  const id = this.find('.id').text();
  const amount = this.find('.amount').text();
  const price = this.find('.price').text();

  storage[id] = { amount, price }; // Всё что нужно по каждому ключу (товару) в одном месте
});

// Проивзодим расчет по итогу перебора выше
const total = Object.keys(storage).reduce((accumulator, productId) => {
  const { amount = 0, price = 0 } = storage[productId];

  accumulator.totalAmount += amount;
  accumulator.totalPrice += (price * amount);

  return accumulator;
}, { totalAmount: 0, totalPrice: 0 });

// В `total` по ключам `totalAmount` / `totalPrice` теперь у нас всё есть

P.S. Не 1в1 с боевым, но база. Используется синтаксис JavaScript ES6.
 
может так
PHP:
var quantity = []; //массив куда указывается общее количество товаров которые хочет купить человек (штуки)
var prices = []; // массив который хранит все цены на выбранные товары

//Собственно записываем в массив цены
jQuery('input[name="price"]').each(function( index ) {
 quantity.push(parseInt(jQuery( this ).val()));
});
//И количество
jQuery('.item .amount').each(function( index ) {
 prices.push(parseInt(jQuery( this ).text().replace(/[^0-9]/g, '')));
});


// вот моя мыслишка:
var total_price =  0;
var total_quantity = 0;
for (index = 0; index < quantity.length; ++index) {
    total_price = total_price + quantity[index]*prices[index]
    total_quantity = total_quantity + quantity[index]
}

//Тут уже вывод
jQuery('.price-total').empty();
jQuery('.price-total').append(thousandSeparator(total_price) + ' ₽');
jQuery('.day-total').empty();
jQuery('.day-total').append(total_quantity + ' шт.');
 }
 calc();
 jQuery('input[name="price"]').change(function() {
calc();

});
 
Назад
Сверху