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

Тема в разделе "JavaScript", создана пользователем Menro, 3 сен 2019.

  1. Menro

    Menro web, seo, email, hack

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

    PHP:

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

    //Собственно записываем в массив цены
    jQuery('input[name="price"]').each(function( index ) {
        
    quantity.push(jQuerythis ).val());
    });
    //И количество
    jQuery('.item .amount').each(function( index ) {
        
    prices.push(jQuerythis ).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();

    });
    Вообщем мне надо как-то два массива между собой посчитать.
    Возможно вообще как-то в один массив объединить.
    Короче опыта не хватает, не пойму как правильно сделать.
    Признателен за любую помощь.
     
  2. Aftal1ck

    Aftal1ck Создатель

    Регистр.:
    22 дек 2007
    Сообщения:
    46
    Симпатии:
    10
    Что то из сказанного будет оффтоп, что то будет надеюсь полезно.
    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.
     
    Menro нравится это.
  3. bobov1

    bobov1 Постоялец

    Регистр.:
    5 авг 2007
    Сообщения:
    92
    Симпатии:
    6
    может так
    PHP:

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

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


    // вот моя мыслишка:
    var total_price =  0;
    var 
    total_quantity 0;
    for (
    index 0index 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();

    });