Отображение общей стоимости цены из таблицы


У меня есть функция JavaScript, которая получает цены из таблицы, добавляет их, и выводит общую стоимость. Я хочу, чтобы рефакторинг это, чтобы сделать его как можно меньше.

function getTotalPrice(do_request)
{
console.log('Get total price');
var prices_array = new Array(); // Where our prices are held

// For each .total_item_price - a <td> within my table.
$(".total_item_price").each(function(){
    var text = $(this).text();                   // Get the value
    var prices = text.substring(1, text.length); // Format it into a string
    prices_array.push(prices);                   // Push it onto our array
});

var result = eval(0);
//  Add up our array
for(i = 0; i < prices_array.length; i++)
{
    temp = eval(prices_array[i]);
    result += temp;
}
// Round up our result to 2 Decimal Places
result = Math.round(result*100)/100;
// Output/Return our result
if (do_request == null)
{
    // We want to add our shipping Price and Display the total
    // Get the Shipping Price
    //var shipping_price = $(".shipping_price").html();
    //shipping_price = shipping_price.substring(1, shipping_price.length);
    if ($(".tbl_row").length == 1) // If only 1 row exists (How do I do this?)
    {
         var size = $(".size").html();
         if((size == "A5") && ($('input[name="qty"]').val() == '1'))
         {
            console.log(' - A5 - ');
            $('.shipping_price').html('£0.67'); // Show Shipping Price (A5)
         }
         else if((size == 'A4') && ($('input[name="qty"]').val() == '1'))
         {
            console.log(' - A4 - ');
            console.log($('input[name="qty"]').val());
            $('.shipping_price').html('£0.87'); // Show Shipping Price (A4)
         }
         else
         {
            console.log('More then 1 Qty');
            $('.shipping_price').html('£0.97'); // Show Shipping Price (A4) 
         }
    }
    else  // More then 1 row exists, so the price will be £0.97
    {
        console.log('false, More rows exists');
        $('.shipping_price').html('£0.97') // Show Shipping Price (A4)
    }

    var shipping_price = $(".shipping_price").html();
    shipping_price = shipping_price.substring(1, shipping_price.length);

    // Add em
    //result += eval(shipping_price);
    result += eval(shipping_price);

    // Round our result to 2 decimal places
    var result=Math.round(result*100)/100;

    // Update & Display the Result
    $('.total_order_price').html("<b>£" + result + "</b>");        
}
else 
{
    // Otherwise we just want the total price and return it.
    return result;
}
}


1722
2
задан 26 августа 2011 в 03:08 Источник Поделиться
Комментарии
2 ответа

Во-первых, я хотел бы перейти от использования eval для parseFloat, так как оказалось, что eval обеспечивает дополнительные функции и позволяет произвольный код, который будет выполнен, если вы просто посчастливилось иметь значения, тогда цифры в total_item_price ТДС.

Во-вторых, поскольку вы выполняете без дополнительной обработки с prices_array, лучше было бы пропустить массива и объединить:

 var prices_array = new Array(); // Where our prices are held
// For each .total_item_price - a <td> within my table.
$(".total_item_price").each(function(){
var text = $(this).text(); // Get the value
var prices = text.substring(1, text.length); // Format it into a string
prices_array.push(prices); // Push it onto our array
});

var result = eval(0);
// Add up our array
for(i = 0; i < prices_array.length; i++)
{
temp = eval(prices_array[i]);
result += temp;
}

в (с результатом переименован в totalSum для удобочитаемости):

 var totalSum = 0;
// For each .total_item_price - a <td> within my table.
$(".total_item_price").each(function(){
var text = $(this).text(); // Get the value
var price = text.substring(1, text.length); // Format it into a string
price = parseFloat(price);
totalSum += price;
});

5
ответ дан 26 августа 2011 в 04:08 Источник Поделиться

Вот тот, который должны учитывать все, включая кол-во.

function getTotalPrice(do_request){

var result = 0;

$(".total_item_price").each(function() {
result += (+$(this).text().slice(1)); // Retrieve price, trim pound sign, convert to num
})

// Short circuit early
if (!do_request) return result.toFixed(2);

// Add shipping depending on qty and size
var shipping = ( +$('input[name="qty"]').val() > 1 ? 0.97
: 'A5' === $(".size").html() ? 0.87
: /*Qty === 1 and size must be A4*/ 0.67
);

// Update & Display the Result
$('.shipping_price').html('£'+shipping)
$('.total_order_price').html('<b>£' + (result+shipping).toFixed(2) + '</b>');

// Return result for consistency
return result;

}

1
ответ дан 27 августа 2011 в 03:08 Источник Поделиться