Start · Sprachen · JavaScript · Referenz · Array.prototype.findLast()

Array.prototype.findLast()

Methode

Durchläuft das Array von hinten nach vorne und gibt das erste Element zurück, für das die Testfunktion einen truthy-Wert liefert – sonst <code>undefined</code>.

seit JavaScript ES2023 (Baseline seit 2022: Chrome 97, Firefox 104 Kategorie: method-property

Signatur

Array.prototype.findLast(callbackFn, thisArg)

Beschreibung

findLast() ist das Gegenstück zu find(): Die Testfunktion wird beginnend beim letzten Index bis zum Index 0 aufgerufen. Sobald sie einen truthy-Wert zurückgibt, bricht die Suche ab und das zugehörige Element (nicht dessen Index) wird zurückgegeben. Trifft kein Element zu, ist der Rückgabewert undefined.

Die Methode eignet sich immer dann, wenn das jüngste oder letzte passende Element gesucht wird – etwa der letzte fehlgeschlagene Log-Eintrag, die zuletzt abgeschlossene Bestellung oder der letzte gültige Messwert. Früher musste man dafür umständlich [...arr].reverse().find(...) schreiben, was eine Kopie erzeugt und unnötig Speicher kostet.

findLast() verändert das Array nicht (sofern die Callback-Funktion es nicht selbst tut). Leere Stellen in dünn besetzten Arrays werden nicht übersprungen, sondern wie undefined behandelt. Die Methode ist generisch und funktioniert auch mit array-ähnlichen Objekten über Array.prototype.findLast.call(); auf TypedArrays existiert eine gleichnamige Methode.

Parameter

Name Typ Default Beschreibung
$callbackFn Pflicht (element: any, index: number, array: Array) => unknown Testfunktion, die für jedes Element (vom Ende her) aufgerufen wird. Erhält element, index und das ursprüngliche array. Ein truthy-Rückgabewert beendet die Suche.
$thisArg any undefined Wert, der innerhalb von callbackFn als this verwendet wird. Bei Pfeilfunktionen wirkungslos.

Rückgabewert

Typ
any | undefined
Beschreibung
Das Element mit dem höchsten Index, das den Test besteht, oder undefined, wenn keines zutrifft.

Beispiele

Letzte gerade Zahl finden

const zahlen = [3, 8, 5, 12, 7, 9];

const letzteGerade = zahlen.findLast((n) => n % 2 === 0);
console.log(letzteGerade);

// Zum Vergleich: find() liefert das erste Treffer-Element
console.log(zahlen.find((n) => n % 2 === 0));
12 8

Letzten Fehler in einem Log ermitteln

const log = [
  { zeit: '10:00', level: 'info', text: 'Server gestartet' },
  { zeit: '10:05', level: 'error', text: 'DB-Timeout' },
  { zeit: '10:07', level: 'info', text: 'Verbindung wiederhergestellt' },
  { zeit: '10:12', level: 'error', text: 'Speicher knapp' },
  { zeit: '10:15', level: 'info', text: 'Cache geleert' }
];

const letzterFehler = log.findLast((eintrag) => eintrag.level === 'error');
console.log(`${letzterFehler.zeit}: ${letzterFehler.text}`);
10:12: Speicher knapp

Kein Treffer und sicherer Zugriff

const bestellungen = [
  { id: 1, status: 'offen' },
  { id: 2, status: 'storniert' }
];

const letzteGeliefert = bestellungen.findLast((b) => b.status === 'geliefert');
console.log(letzteGeliefert);
console.log(letzteGeliefert?.id ?? 'Keine gelieferte Bestellung');
undefined Keine gelieferte Bestellung

Dünn besetzte Arrays und array-ähnliche Objekte

const luecken = [1, , 3, ,];
luecken.findLast((wert, index) => {
  console.log(index, wert);
  return false;
});

const arrayAehnlich = { length: 3, 0: 'a', 1: 'bb', 2: 'c' };
const treffer = Array.prototype.findLast.call(arrayAehnlich, (s) => s.length === 1);
console.log(treffer);
3 undefined 2 3 1 undefined 0 1 c

// Wichtig · Fallstricke

  • Mehrdeutiges undefined: Enthält das Array selbst undefined-Werte, lässt sich am Rückgabewert nicht erkennen, ob ein Treffer vorlag. Dann besser findLastIndex() verwenden und auf -1 prüfen.
  • Element statt Index: Wer die Position benötigt, greift zu findLastIndex(); wer nur prüfen will, ob ein Wert existiert, zu some() oder includes().
  • Mutation während der Iteration: Die Länge wird vor dem ersten Aufruf festgelegt. Nachträglich geänderte Elemente werden mit ihrem aktuellen Wert besucht, gelöschte als undefined. Das Array im Callback zu verändern, ist schlechter Stil.
  • Kompatibilität: Seit ES2023 standardisiert; verfügbar ab Chrome/Edge 97, Firefox 104, Safari 15.4 und Node.js 18. Für ältere Umgebungen ist ein Polyfill (z. B. core-js) nötig. In TypeScript muss lib mindestens ES2023 enthalten.
  • Performance: Im Gegensatz zu [...arr].reverse().find() entsteht keine Kopie, und die Suche bricht beim ersten Treffer ab.