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

TypedArray.prototype.sort()

Methode

Sortiert die Elemente eines typisierten Arrays direkt im Array (in place), standardmäßig numerisch aufsteigend, und gibt dasselbe Array zurück.

seit JavaScript ES2015 Kategorie: method-property

Signatur

TypedArray.prototype.sort(compareFn)

Beschreibung

sort() ordnet die Elemente eines typisierten Arrays (z. B. Int32Array, Float64Array, BigInt64Array) direkt im vorhandenen Speicher neu an. Es wird keine Kopie erzeugt: Die Methode verändert das Array und gibt eine Referenz auf genau dieses Array zurück.

Anders als bei Array.prototype.sort() sortiert die Methode ohne Vergleichsfunktion numerisch und nicht lexikografisch nach Zeichenketten. Aus [10, 9, 1] wird also wie erwartet [1, 9, 10]. NaN-Werte landen bei Gleitkomma-Arrays am Ende, und -0 wird vor +0 einsortiert.

Mit einer eigenen Vergleichsfunktion compareFn(a, b) legst du jede beliebige Reihenfolge fest, etwa absteigend oder nach Betrag. Die Funktion gibt eine negative Zahl zurück, wenn a vor b kommen soll, eine positive, wenn a nach b kommen soll, und 0, wenn beide als gleich gelten. Seit ES2019 ist die Sortierung stabil.

Typische Einsatzgebiete sind Messwerte, Audio-Samples, Pixel- oder Geometriedaten und andere große Zahlenmengen, bei denen sich die Speicher- und Geschwindigkeitsvorteile typisierter Arrays lohnen. Wenn das Original erhalten bleiben soll, nimm toSorted() (ES2023).

Parameter

Name Typ Default Beschreibung
$compareFn (a: number | bigint, b: number | bigint) => number numerisch aufsteigend Optionale Vergleichsfunktion. Rückgabe < 0: a kommt vor b; > 0: b kommt vor a; 0: Reihenfolge bleibt erhalten. Muss eine number zurückgeben, auch bei BigInt64Array.

Rückgabewert

Typ
TypedArray
Beschreibung
Referenz auf dasselbe typisierte Array, jetzt sortiert. Es wird keine Kopie angelegt.

Beispiele

Numerische Standardsortierung (anders als bei Array)

const werte = new Uint16Array([10, 9, 100, 1, 25]);
werte.sort();
console.log(werte);

// Zum Vergleich: normales Array sortiert als Zeichenketten
console.log([10, 9, 100, 1, 25].sort());
Uint16Array(5) [1, 9, 10, 25, 100] [1, 10, 100, 25, 9]

Absteigend sortieren mit Vergleichsfunktion

const punkte = new Float32Array([3.5, -1.25, 8, 0.5]);
punkte.sort((a, b) => b - a);
console.log(punkte);
Float32Array(4) [8, 3.5, 0.5, -1.25]

Median aus Messwerten, Original bleibt erhalten

const messungen = new Float64Array([21.4, NaN, 19.8, 23.1, 20.5]);

// Kopie sortieren, damit das Original unverändert bleibt
const sortiert = messungen.slice().sort();
console.log(sortiert); // NaN steht am Ende

const gueltig = sortiert.filter((x) => !Number.isNaN(x));
const mitte = Math.floor(gueltig.length / 2);
const median = gueltig.length % 2
  ? gueltig[mitte]
  : (gueltig[mitte - 1] + gueltig[mitte]) / 2;
console.log(median);
Float64Array(5) [19.8, 20.5, 21.4, 23.1, NaN] 20.95

BigInt64Array: Vergleichsfunktion muss number liefern

const ids = new BigInt64Array([30n, -5n, 12n]);

// b - a wäre ein BigInt und würde einen TypeError auslösen
ids.sort((a, b) => (a < b ? 1 : a > b ? -1 : 0));
console.log(ids);
BigInt64Array(3) [30n, 12n, -5n]

// Wichtig · Fallstricke

  • Verändert das Array: sort() arbeitet in place. Wenn sich andere Views denselben ArrayBuffer teilen, sehen sie die neue Reihenfolge ebenfalls. Für eine nicht verändernde Variante toSorted() oder slice().sort() verwenden.
  • Keine Zeichenketten-Sortierung: Ohne compareFn wird numerisch sortiert. Wer Code von Array.prototype.sort() übernimmt, braucht hier kein (a, b) => a - b.
  • BigInt-Arrays: a - b ergibt ein BigInt, und die Umwandlung in eine Zahl löst einen TypeError aus. Deshalb explizit -1, 0 oder 1 zurückgeben.
  • NaN in der Vergleichsfunktion: Gibt compareFn NaN zurück, wird das wie 0 behandelt. Eine inkonsistente Vergleichsfunktion führt zu einer implementierungsabhängigen Reihenfolge.
  • Abgekoppelter Buffer: Auf einem Array, dessen ArrayBuffer abgekoppelt (detached) ist, löst sort() einen TypeError aus.
  • Kompatibilität: Wird in allen modernen Browsern und in Node.js unterstützt. Garantiert stabil ist die Sortierung seit ES2019. toSorted() gibt es erst ab ES2023 (Chrome 110, Firefox 115, Safari 16).