Start · Sprachen · JavaScript · Referenz · Intl.Collator.prototype.compare()

Intl.Collator.prototype.compare()

Methode

Vergleicht zwei Strings nach den Sortierregeln von Sprache und Optionen des Collators und gibt eine negative Zahl, <code>0</code> oder eine positive Zahl zurück.

seit JavaScript ECMA-402 1. Ausgabe (2012) – Baseline: alle Browse Kategorie: method-property

Signatur

Intl.Collator.prototype.compare(string1, string2)

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

Typ
number
Beschreibung
Eine negative Zahl, wenn 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));
["Bär", "Zoe", "apfel", "Äpfel", "Ärger"] ["apfel", "Äpfel", "Ärger", "Bär", "Zoe"]

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'));
true true false

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));
["bericht1.pdf", "Bericht2.pdf", "Bericht10.pdf"]

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'));
-1 1

// Wichtig · Fallstricke

  • Nur das Vorzeichen auswerten: Viele Engines geben -1, 0 und 1 zurück, garantiert ist das aber nicht. Prüfen Sie deshalb mit < 0, > 0 oder === 0, nicht mit === -1.
  • Performance: Erzeugen Sie den Collator einmal außerhalb von Schleifen und Sortierfunktionen. Ein new Intl.Collator() bei jedem Vergleich, oder localeCompare() mit Optionen in großen Listen, bremst stark.
  • 0 heißt nicht „identisch“: Bei sensitivity: '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.