7 Stimmen

Jedes n-te Element im Array abrufen

Ich habe ein Array von HTML-Elementen. Ich prüfe, ob ein vorheriges Objekt im Array wie folgt existiert:

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
});

Das funktioniert gut. Aber ich müsste auch die Existenz jedes vierten Objekts (Box) im Array überprüfen, oder genauer gesagt, ob ein Objekt drei Objekte vor dem aktuellen existiert.

Das klappt nicht:

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

Ich glaube, mit jQuery.grep() und prüfen, ob (i % 4) == 0 könnte die Antwort sein, aber mit meinem begrenzten Wissen über Javascript, weiß ich nicht, wie man es auf das, was ich jetzt habe, anwenden.

Kann jemand helfen? Danke!

16voto

glenatron Punkte 10573

Können Sie nicht einfach eine for-Schleife verwenden?

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

Ich bin nicht groß auf JQuery speziell, aber in regelmäßigen JavaScript, die gut funktionieren würde.

EDIT: Sie haben das Problem ein wenig umschrieben, Sie wollen also bei jedem Punkt handeln, aber beim vierten etwas Bestimmtes tun...

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
      }
  }

Hier ist die breiter angelegte previousTop wird dann bei jedem vierten Element gesetzt, bevor Sie das tun, was Sie sonst noch tun müssen. Wenn Sie dann das nächste vierte Element erreichen, haben Sie den Wert des vorherigen Elements in Ihrer temporären Variablen, was sich ähnlich anhört wie das, wonach Sie in Ihrer Antwort auf die Antwort von @patrick dw unten suchen.

0 Stimmen

Danke! Ich möchte dies innerhalb der .each()-Schleife aber tun, da ich andere Dinge innerhalb es bereits tun.

0 Stimmen

Machen Sie das Gleiche und erhöhen Sie i um eins, dann haben Sie statt der anonymen Funktion nur ein paar Zeilen Code dort. Das ist transparenter und einfacher zu debuggen.

0 Stimmen

Nochmals vielen Dank! Ich glaube, dies hat immer noch das gleiche Problem, dass @patrick dw's ursprüngliche Lösung. Was ich brauchte, war in jeder Iteration der Schleife, um drei Schritte zurück zu gehen und einen Wert von dort zu bekommen, während dies jedes vierte Element (0, 3, 6, 9 usw.) bekommt. Tut mir leid, ich war einfach nicht spezifisch genug!

3voto

user113716 Punkte 309387

Sie können die Modulus-Operator in der Schleife, um zu sehen, ob Sie sich in einem vierten Intervall befinden.

Die Frage wurde geklärt.

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 Stimmen

Danke Patrick, aber das ist nicht ganz das, was ich will. Ich brauche eine position().top Wert aus dem Objekt und fügen Sie ihm einen anderen Wert hinzu. In anderen boxes[3] benötigt einen Wert aus boxes[0] , boxes[6] de boxes[3] , boxes[8] de boxes[5] und so weiter. Entschuldigung, ich habe Schwierigkeiten, dies auf einfache Weise zu erklären, und war daher nicht spezifisch genug.

0 Stimmen

Mit anderen Worten, bei jeder Iteration muss ich drei Schritte zurückgehen, um eine position().top Wert aus der Box und verwenden Sie ihn, um einen neuen Wert für diese aktuelle Box zu berechnen.

0 Stimmen

@hannu: Wollen Sie damit sagen, dass für jede Element, wollen Sie dasjenige, das 3 dahinter ist? Ihre Nummerierung in dem obigen Kommentar ist nicht konsistent. Sie geht von 3 über 6 bis 8. Es gibt da kein Muster.

1voto

developer Punkte 55

Verwenden Sie eine Iteration mit 4 als Inkrementierungsschritt und nicht wie üblich mit 1.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X