Signatur
Beschreibung
lastIndexOf() durchsucht ein typisiertes Array (z. B. Uint8Array, Float32Array, BigInt64Array) von hinten nach vorne und gibt den Index des ersten Treffers zurück. Aus Sicht des Arrays ist das also das letzte Vorkommen des Werts. Wird nichts gefunden, ist das Ergebnis -1. Der Algorithmus entspricht dem von Array.prototype.lastIndexOf(). Verglichen wird mit strikter Gleichheit (===).
Typische Einsatzfälle sind binäre Daten: das letzte Trennzeichen in einem Byte-Puffer finden, etwa das letzte Zeilenende (0x0A) in einem Stream-Chunk. Weitere Beispiele sind das letzte Vorkommen einer Markierung in Messdaten oder das Ende eines Datensatzes in einem ArrayBuffer.
Mit dem optionalen Parameter fromIndex legst du fest, ab welcher Position rückwärts gesucht wird. Ein negativer Wert zählt vom Ende aus (-1 ist das letzte Element). Liegt der berechnete Startindex vor dem Array-Anfang, wird gar nicht gesucht und die Methode gibt sofort -1 zurück.
Brauchst du eine eigene Bedingung statt eines festen Werts, zum Beispiel um nach NaN oder nach Werten über einem Schwellwert zu suchen, verwende findLastIndex().
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $searchElement Pflicht | number | bigint | Der gesuchte Wert. Er wird mit === verglichen. Bei BigInt64Array und BigUint64Array musst du einen bigint übergeben (z. B. 1n), sonst gibt es keinen Treffer. |
|
| $fromIndex | number | length - 1 | Index, ab dem rückwärts gesucht wird. Der Wert wird in eine Ganzzahl umgewandelt. Negative Werte zählen vom Ende aus (length + fromIndex). Ist das Ergebnis kleiner als 0, wird -1 zurückgegeben. Werte ab length bedeuten: Suche ab dem letzten Element. |
Rückgabewert
i ≤ fromIndex mit array[i] === searchElement, oder -1, wenn es keinen solchen Index gibt.Beispiele
Grundlagen: letztes Vorkommen und fromIndex
const bytes = new Uint8Array([2, 5, 9, 2]);
console.log(bytes.lastIndexOf(2)); // letztes Vorkommen
console.log(bytes.lastIndexOf(7)); // nicht vorhanden
console.log(bytes.lastIndexOf(2, 2)); // rückwärts ab Index 2
console.log(bytes.lastIndexOf(2, -1)); // ab dem letzten Element
console.log(bytes.lastIndexOf(2, -2)); // ab Index 4 - 2 = 2
console.log(bytes.lastIndexOf(2, -10)); // Startindex vor Array-Anfang
Letztes Zeilenende in einem Byte-Puffer finden
const encoder = new TextEncoder();
const decoder = new TextDecoder();
const chunk = encoder.encode('Zeile 1\nZeile 2\nunvollständ');
const NEWLINE = 0x0a;
const lastNl = chunk.lastIndexOf(NEWLINE);
// Vollständige Zeilen verarbeiten, den Rest für den nächsten Chunk aufheben
const complete = decoder.decode(chunk.subarray(0, lastNl));
const rest = chunk.subarray(lastNl + 1);
console.log(complete.split('\n'));
console.log(decoder.decode(rest));
Alle Vorkommen rückwärts sammeln
const findAllFromEnd = (arr, value) => {
const result = [];
let idx = arr.lastIndexOf(value);
while (idx !== -1) {
result.push(idx);
if (idx === 0) break; // sonst würde fromIndex -1 wieder am Ende beginnen!
idx = arr.lastIndexOf(value, idx - 1);
}
return result;
};
const samples = new Int16Array([0, 7, 0, 3, 0]);
console.log(findAllFromEnd(samples, 0));
Fallstricke: Float32-Rundung, NaN und BigInt
const f32 = new Float32Array([0.1, 0.5, 0.1]);
console.log(f32.lastIndexOf(0.1)); // 0.1 ist als float32 ein anderer Wert
console.log(f32.lastIndexOf(Math.fround(0.1))); // korrekt gerundet
const f64 = new Float64Array([1, NaN, 3]);
console.log(f64.lastIndexOf(NaN)); // NaN !== NaN
console.log(f64.findLastIndex(Number.isNaN)); // Alternative
const big = new BigInt64Array([1n, 2n, 1n]);
console.log(big.lastIndexOf(1n));
console.log(big.lastIndexOf(1)); // number statt bigint