2011-01-26 21 views
7

Tengo una matriz de elementos HTML. Estoy comprobando si existe un objeto anterior en la matriz como este:Obtenga cada enésimo elemento en el conjunto

var boxes = $('.box'); // creating the array 

boxes.each(function(i){ // going through the array 
    var prevBox = i>0?$(boxes[i-1]):false; // check whether a previous box exists 
    if (prevBox) { } // do something 
    else { } // do something else 
}); 

Esto funciona bien. Pero también necesitaría verificar la existencia de cada cuarto objeto (cuadro) en la matriz, o más precisamente si un objeto tiene tres objetos antes de la actual.

Esto no funciona:

var prevBox = i>0?$(boxes[i-4]):false; 

Creo usando jQuery.grep() y comprobando si (i % 4) == 0 podría ser la respuesta, pero con mi limitado conocimiento de Javascript, no sé cómo aplicarlo a lo que ten ahora.

¿Alguien puede ayudar? ¡Gracias!

Respuesta

3

Puede usar el modulus operator en el ciclo para ver si se encuentra en un cuarto intervalo.

La pregunta fue aclarada.

var boxes = $('.box'); // creating the array 

boxes.each(function(i){ 
    if(i >= 3) { 
     var prevBox = boxes.eq(i - 3); 
     var pos = prevBox.position(); 
     var top = pos.top; 
    } 
}); 
+0

Gracias Patrick, pero no acaba de hacer lo que estoy buscando. Necesito obtener un valor 'position(). Top' del objeto y agregarle otro valor. En otras 'cajas [3]' necesita un valor de 'cajas [0]', 'cajas [6]' de 'cajas [3]', 'cajas [8]' de 'cajas [5]' y así sucesivamente. Lo siento, tengo problemas para explicar esto de una manera simple y, por lo tanto, no era lo suficientemente específico. – hannu

+0

En otras palabras, en cada iteración necesito retroceder tres pasos, obtener un valor 'position(). Top' del cuadro y usarlo para calcular un nuevo valor para este cuadro actual. – hannu

+0

@hannu: ¿Estás diciendo que para el elemento * each *, quieres el que está 3 detrás? Su numeración en el comentario anterior no es consistente. Va de 3 a 6 a 8. No hay un patrón allí. – user113716

1

Utilice una iteración con 4 como el paso de aumentar y no lo habitual 1.

16

¿Puede usted no sólo tiene que utilizar un bucle for?

for (var i=0; i< boxes.length; i+=4) 
    { 
    // do stuff with boxes[i] 
    } 

No soy grande en JQuery específicamente, pero en JavaScript normal que funcionaría bien.

EDIT: Usted ha redescribió el problema un poco, por lo que desea actuar en cada artículo, pero hacer algo específico en la cuarta ...

var previousTop; 
for (var i=0; i< boxes.length; i++) 
    { 
    // do stuff with boxes[i] 
    if (((i+1) % 4) === 0) 
     { 
      previousTop = boxes[i].position.top; 
      // do stuff with the fourth item 
     } 
    } 

Aquí el sentido más amplio de ámbito se establece entonces previousTop cada cuarto elemento antes de hacer cualquier otra cosa que necesite hacer. Luego, cuando llegas al siguiente cuarto elemento, tienes el valor del anterior en tu variable temporal, que suena similar a lo que estás buscando a partir de tu respuesta a la respuesta de @patrick dw a continuación.

+0

Gracias! Sin embargo, me gustaría hacer esto dentro del ciclo .each() ya que estoy haciendo otras cosas dentro de él. – hannu

+0

Haga lo mismo e incremente i por uno, luego, en lugar de la función anónima, solo tiene unas pocas líneas de código allí. Más transparente y más fácil de depurar. – glenatron

+0

¡Gracias de nuevo! Creo que esto todavía tiene el mismo problema que la solución original de @patrick dw. Lo que necesitaba en cada iteración del ciclo era retroceder tres pasos y obtener un valor a partir de allí, mientras que esto obtiene cada cuarto elemento (0, 3, 6, 9, etc.). Lo siento, ¡simplemente no era lo suficientemente específico! – hannu

Cuestiones relacionadas