Signatur
Beschreibung
Die Methode compare() einer Intl.Collator-Instanz vergleicht zwei Strings nach den Regeln, die beim Erzeugen des Collators festgelegt wurden: Sprache (locale), sensitivity, numeric, caseFirst, ignorePunctuation usw. So landen Umlaute, Akzente und Groß-/Kleinbuchstaben dort, wo ein Mensch sie in der jeweiligen Sprache erwartet. Der normale Vergleich mit < oder Array.prototype.sort() ohne Vergleichsfunktion arbeitet dagegen nur mit UTF-16-Codeeinheiten.
Technisch ist compare eine Getter-Eigenschaft. Sie liefert eine Funktion, die schon an den Collator gebunden ist. Deshalb kann man sie direkt an Array.prototype.sort() oder toSorted() übergeben, z. B. liste.sort(collator.compare), ohne bind() oder eine Pfeilfunktion drumherum.
Wenn man viele Vergleiche macht, etwa beim Sortieren großer Listen, sollte man einen Collator einmal erzeugen und dann wiederverwenden. String.prototype.localeCompare() liefert dieselben Ergebnisse, baut intern aber bei jedem Aufruf die Sortierregeln neu auf und ist deshalb deutlich langsamer.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $string1 Pflicht | string | Erster String für den Vergleich. Andere Werte werden in einen String umgewandelt (undefined wird zu "undefined"). |
|
| $string2 Pflicht | string | Zweiter String für den Vergleich, wird genauso umgewandelt. |
Rückgabewert
string1 vor string2 einsortiert wird, eine positive Zahl, wenn er danach kommt, und 0, wenn beide nach den Regeln des Collators gleich sind. Die Spezifikation legt nur das Vorzeichen fest, nicht den genauen Wert.Beispiele
Deutsche Wörter mit Umlauten richtig sortieren
const woerter = ['Zoe', 'Ärger', 'apfel', 'Bär', 'Äpfel'];
// Standard-Sortierung nach UTF-16-Codeeinheiten
console.log([...woerter].sort());
// Sortierung nach deutschen Regeln
const collator = new Intl.Collator('de');
console.log([...woerter].sort(collator.compare));
Groß-/Kleinschreibung und Akzente beim Vergleich ignorieren
const basis = new Intl.Collator('de', { sensitivity: 'base' });
const istGleich = (a, b) => basis.compare(a, b) === 0;
console.log(istGleich('Straße', 'STRASSE'));
console.log(istGleich('résumé', 'Resume'));
console.log(istGleich('Haus', 'Maus'));
Natürliche Sortierung von Dateinamen mit Zahlen (numeric)
const dateien = [
{ name: 'Bericht10.pdf' },
{ name: 'Bericht2.pdf' },
{ name: 'bericht1.pdf' }
];
const { compare } = new Intl.Collator('de', { numeric: true, sensitivity: 'base' });
// compare ist bereits gebunden – Destrukturieren ist problemlos
const sortiert = dateien.toSorted((a, b) => compare(a.name, b.name));
console.log(sortiert.map(d => d.name));
Sprachabhängige Ergebnisse: Deutsch vs. Schwedisch
const de = new Intl.Collator('de');
const sv = new Intl.Collator('sv');
// Im Deutschen wird ä wie a einsortiert, im Schwedischen steht ä nach z
console.log(de.compare('ä', 'z'));
console.log(sv.compare('ä', 'z'));
// Wichtig · Fallstricke
- Nur das Vorzeichen auswerten: Viele Engines geben
-1,0und1zurück, garantiert ist das aber nicht. Prüfen Sie deshalb mit< 0,> 0oder=== 0, nicht mit=== -1. - Performance: Erzeugen Sie den Collator einmal außerhalb von Schleifen und Sortierfunktionen. Ein
new Intl.Collator()bei jedem Vergleich, oderlocaleCompare()mit Optionen in großen Listen, bremst stark. 0heißt nicht „identisch“: Beisensitivity: 'base'oder'accent'gelten auch unterschiedliche Strings als gleich. Wo Eindeutigkeit wichtig ist (Schlüssel, IDs), verwenden Sie===.- Die Ergebnisse hängen von den ICU- bzw. CLDR-Daten der jeweiligen Umgebung ab. Sie können sich zwischen Browsern, Node.js-Builds (z. B.
small-icu) und Versionen leicht unterscheiden. Verlassen Sie sich in Tests nicht auf genau dieselbe Reihenfolge bei Sonderfällen. - Wird eine Sprache nicht unterstützt, nimmt der Collator ohne Fehlermeldung die Standardsprache. Welche tatsächlich verwendet wird, zeigt
collator.resolvedOptions().locale. - Der Vergleich ist für Sortieren und Suchen gedacht, nicht für sicherheitsrelevante Gleichheitsprüfungen wie Passwörter oder Tokens.