Start · Sprachen · JavaScript · Referenz · TypedArray.prototype.lastIndexOf()

TypedArray.prototype.lastIndexOf()

Methode

Durchsucht ein typisiertes Array rückwärts und gibt den letzten Index zurück, an dem <code>searchElement</code> vorkommt, oder <code>-1</code>, wenn der Wert fehlt.

seit JavaScript ES2015 (Baseline: alle Browser, Node.js 4+) Kategorie: method-property

Signatur

TypedArray.prototype.lastIndexOf(searchElement, fromIndex)

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

Typ
number
Beschreibung
Der größte Index 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
3 -1 0 3 0 -1

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));
[ 'Zeile 1', 'Zeile 2' ] unvollständ

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));
[ 4, 2, 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
-1 2 -1 1 2 -1