2011-06-07 25 views
5

Estoy usando JQuery para calcular algunas cifras de totales y me he encontrado con un problema.Looping a través de dos selectores diferentes al mismo tiempo

Digamos que tengo dos conjuntos de entradas, cada una con un nombre único.

$('[name="quantity\\[\\]"]') 
$('[name="price\\[\\]"]') 

Quiero desplazarse por cada conjunto de entradas al mismo tiempo, de modo que pueda comprobar tanto para (! IsNaN) y (longitud! == 0), y si los valores son válidos, quiero multiplícalos juntos y agrega a un total acumulado.

Sé que puedo recorrer un selector utilizando cada uno(), pero ¿cómo puedo pasar por dos al mismo tiempo? ¿hay una forma elegante de lograr este objetivo?

+1

¿Hay un número igual de ambos conjuntos de entradas? ¿Puedes mostrar el margen con el que estás trabajando? Tal vez una [JS Fiddle demo] (http://jsfiddle.net/)? –

+0

¿Estos campos aparecen en pares en la página? –

+0

@David Thomas @ Šime Vidas sí aparecen en pares, y siempre hay un número igual de ambas entradas. – dqhendricks

Respuesta

0
var prices = $('[name="price\\[\\]"]'); 
$('[name="quantity\\[\\]"]').each(function(i){ 
    var quantity = this; 
    var price = prices[i]; 
    // Compare them here. 
}); 
+0

perfecto. ¡Gracias! – dqhendricks

0

Utilice una coma:

$('[name="quantity\\[\\]"], [name="price\\[\\]"]') 
+2

(+1) ayudará a que el selector funcione mucho si un elemento tipo también se proporciona, por ejemplo '$ ('input [name =" quantity \\ [\\] "], input [name =" price \\ [\\] "]')' –

+4

@Matt No creo que el OP quiera pasar por un ciclo los conjuntos secuencialmente. Creo que quiere hacer un ciclo a través de * ambos * conjuntos al mismo tiempo ... –

+0

Ah, buen punto ... –

3

todas las cosas lindas de jQuery a un lado, aquí es una función genérica "zip".

a y b deberían ser matrices (o al menos tipo array). Si se suministra fn, esto actuará como un mapa sobre cada par de elementos. Recuerde que los objetos jQuery son matrices.

function zip (a, b, fn) { 
    var len = Math.max(a.length, b.length) 
    var result = [] 
    if (fn) { 
    for (var i = 0; i < len; i++) { 
     result.push(fn(a[i], b[i])) 
    } 
    } else { 
    for (var i = 0; i < len; i++) { 
     result.push([a[i], b[i]]) 
    } 
    } 
    return result 
} 

Ejemplo:

var z = zip([1,2,3], ['a','b']) 
// z = [[1,'a'],[2,'b'],[3,undefined] 
for (var i = 0; i < z.length; i++) { 
    var elm = z[i] 
    var a = elm[0] 
    var b = elm[1] 
    alert(a + "-" + b) 
} 

Ejemplo con fn:

zip([1,2,3], ['a','b'], function (a, b) { 
    alert(a + "-" + b) 
}) 

Ejemplo en contexto jQuery'ish:

var total = 0 
zip(
    $('[name="quantity\\[\\]"]'), 
    $('[name="price\\[\\]"]'), 
    function (a, b) { 
    // if either a or b are undefined, there is already a problem 
    // the `expr || 0` is to silently handle cases of `NaN || 0` which may 
    // result if the price or quantity are garbage values 
    var qty = parseInt($(a).val(), 10) || 0 
    var price = parseInt($(b).val(), 10) || 0 
    total += qty * price 
    }) 

codificación feliz.

+1

Buenas funciones, pero le faltan algunos puntos y comas ': (' –

+0

@Matt Ball no dude en editarlos en ;-) –

1

Almacenar el resultado de la selección en una variable, y usar el argumento index para el each al enumerar para hacer referencia al elemento relacionado en el otro conjunto.

var quan = $('[name="quantity\\[\\]"]'); 
var price = $('[name="price\\[\\]"]'); 
var total = 0; 

quan.each(function(index) { 
    var quan_val = +$(this).val(); 
    var price_val = +price.eq(index).val(); 

    if(quan_val && price_val) { 
     total += (quan_val * price_val); 
    } 
}); 

alert(total); 
0

bucle y utilizar el índice

var quantity = $('[name="quantity\\[\\]"]') 
$('[name="price\\[\\]"]').each(function(ind){ 
    var currentPrice = $(this); 
    var currentQuantity = quantity.eq(ind); 
}); 

o algo así

$('[name="price\\[\\]"]').each(function(ind){ 
    var currentPrice = $(this); 
    var currentQuantity = currentPrice.closest('[name="quantity\\[\\]"]'); 
}); 
1

¿Qué tal esto:

function getValue() { return this.value; } 

var valsA = $('input[name="quantity\\[\\]"]').map(getValue).get(), 
    valsB = $('input[name="price\\[\\]"]').map(getValue).get(); 

for (var i = 0; i < valsA.length; i++) { 
    // work with valsA[i] and valsB[i] here 
} 
2

Aquí está una solución directa

var quantities = $('[name="quantity\\[\\]"]'), 
    prices = $('[name="price\\[\\]"]'); 


var len = Math.max(quantities.size(), prices.size()); 
for (var i=0; i < len; i++) { 
    var quantity = quantities.get(i); 
    var price = prices.get(i); 
    // Do whatever you want with quantity and price  
} 
+0

+1 por ser simple y efectivo –

+1

O 'cantidades [i]/precios [i]' o 'quantity.eq (i) /prices.eq (i)' ... –

Cuestiones relacionadas