Fang für jede letzte Iteration

86
arr = [1,2,3];
arr.forEach(function(i){
// last iteration
});

Wie fange ich, wenn die Schleife endet? Ich kann es tun, if(i == 3)aber ich weiß möglicherweise nicht, wie hoch die Nummer meines Arrays ist.

Jamie Anderson
quelle

Antworten:

165

Die aktualisierte Antwort für ES6 + ist hier .


arr = [1, 2, 3]; 

arr.forEach(function(i, idx, array){
   if (idx === array.length - 1){ 
       console.log("Last callback call at index " + idx + " with value " + i ); 
   }
});

würde ausgeben:

Last callback call at index 2 with value 3

Dies funktioniert anhand arr.lengthdes Tests an dem aktuellen Index des Arrays, der an die Rückruffunktion übergeben wird .

jdphenix
quelle
Ich kann dahinter kommen, es ist ein bisschen klarer, obwohl ich nicht sicher bin, ob es tatsächlich etwas anderes garantiert, da arres bereits als Abschluss für jeden Rückruf gilt
jdphenix
und sofort nach dem Posten wurde mir ein offensichtlicher Anwendungsfall klar - wenn Sie den Rückruf an anderer Stelle definiert hatten. Verlegenes Gesicht einfügen.
jdphenix
kein verlegenes Gesicht nötig. Ich hatte genau diese Frage (Warum brauchst du ein Array, wenn du angekommen bist), aber deine Beobachtung / Frage hat das geklärt, also danke. Obwohl es seltsam ist, dass Sie diese Antwort selbst geschrieben haben und Ihre eigene Antwort in Frage stellen? Gibt es andere Kommentare, auf die Sie geantwortet haben und die jetzt vielleicht gelöscht wurden?
Redfox05
@Russell Das ist richtig, es gibt (gab) eine Diskussion, die seitdem teilweise entfernt wurde.
JDphenix
33

Die ES6 + ANTWORT 2018 IST :

    const arr = [1, 2, 3];

    arr.forEach((val, key, arr) => {
      if (Object.is(arr.length - 1, key)) {
        // execute last item logic
        console.log(`Last callback call at index ${key} with value ${val}` ); 
      }
    });
Sterling Bourne
quelle
Ich mag dieses heute besser - obwohl ich schon 2015 zugeben werde, dass es eine schlechte Idee war, implizit eine globale zu erklären.
jdphenix
1
Vergessen Sie nicht, dass const und let keine globalen Deklarationen sind, da sie nur im unmittelbaren Bereich gültig sind ... im Gegensatz zu var, das an die Spitze der Methode gesetzt wird.
Sterling Bourne
Huhh ... Die vorherige Version ist viel prägnanter und lesbarer. Dieses Objekt Zeug ist ein Chaos.
Giorgio79
2
Es ist nur ein Chaos, wenn Sie es nicht verstehen Giorgio79. Die Verwendung von Object.is () als primäre Vergleichsmethode gegenüber == oder === bietet zahlreiche Vorteile. Vielen Dank für Ihren Kommentar!
Sterling Bourne
1
@SterlingBourne können Sie weiter erklären, was diese Vorteile sind? (Es wäre gut, das auch in die Antwort aufzunehmen)
ludovico
4
const arr= [1, 2, 3]
arr.forEach(function(element){
 if(arr[arr.length-1] === element){
  console.log("Last Element")
 }
})
Justin Coleman
quelle
1
Könnte nicht immer funktionieren. let o = { val:"ue" } ; let arr = [ o, 1, o ]; ...Leider wird die erste Iteration habenarr[arr.length-1] === element
e2-e4