Signatur
Beschreibung
Intl.Collator ist Teil der ECMAScript Internationalization API und stellt einen leistungsfähigen, lokalisierungsgerechten Zeichenfolgenvergleich bereit. Im Gegensatz zu einfachen Vergleichen mit < oder > berücksichtigt ein Collator sprachspezifische Regeln – etwa die korrekte Sortierung von Umlauten im Deutschen (ä nach a), die Groß-/Kleinschreibung oder die Behandlung von Akzenten.
Ein Intl.Collator-Objekt wird einmalig mit einer Locale (z. B. 'de-DE') und Optionen wie sensitivity, usage oder numeric erstellt. Anschließend kann die Methode compare(a, b) wie eine Komparatorfunktion für Array.prototype.sort() verwendet werden, was besonders effizient ist, da das Objekt intern wiederverwendet wird statt bei jedem Vergleich neu initialisiert zu werden.
Die Option usage unterscheidet zwischen 'sort' (Standard, für Sortierungen) und 'search' (für Suche, bei der z. B. Akzente ignoriert werden sollen). Mit sensitivity lässt sich steuern, ob Groß-/Kleinschreibung und Akzente berücksichtigt werden. Die Option numeric: true bewirkt, dass Zahlen in Strings numerisch verglichen werden ('10' kommt nach '9').
Die statische Methode Intl.Collator.supportedLocalesOf() erlaubt es, vorab zu prüfen, welche der gewünschten Locales nativ unterstützt werden, ohne auf einen Fallback zurückgreifen zu müssen.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $locales | string | string[] | Systemlocale | Ein BCP-47-Sprach-Tag (z. B. 'de-DE', 'en-US') oder ein Array solcher Tags. Bestimmt, welche Sprach- und Sortierregeln angewendet werden. |
| $options | object | {} | Optionsobjekt mit folgenden Eigenschaften:
|
Rückgabewert
Intl.Collator-Instanz mit der Methode compare(a, b) und der Methode resolvedOptions().Beispiele
Deutsches Array mit Umlauten korrekt sortieren
const woerter = ['Zebra', 'Apfel', 'Österreich', 'Äpfel', 'Banane', 'über'];
const collator = new Intl.Collator('de-DE');
const sortiert = woerter.sort(collator.compare);
console.log(sortiert);
Numerische Sortierung und Groß-/Kleinschreibung ignorieren
// Numerische Sortierung: '10' soll nach '9' kommen
const dateien = ['datei10.txt', 'datei9.txt', 'datei2.txt', 'datei1.txt'];
const numericCollator = new Intl.Collator('de-DE', { numeric: true });
console.log(dateien.sort(numericCollator.compare));
// ['datei1.txt', 'datei2.txt', 'datei9.txt', 'datei10.txt']
// Suche: Akzente und Groß-/Kleinschreibung ignorieren
const suchCollator = new Intl.Collator('de-DE', {
usage: 'search',
sensitivity: 'base',
});
const begriffe = ['Café', 'cafe', 'CAFE', 'Kaffee'];
const treffer = begriffe.filter(
(b) => suchCollator.compare(b, 'cafe') === 0
);
console.log(treffer);
// ['Café', 'cafe', 'CAFE']
resolvedOptions und supportedLocalesOf
// Welche Optionen wurden tatsächlich angewendet?
const col = new Intl.Collator('de-DE', { numeric: true, caseFirst: 'upper' });
console.log(col.resolvedOptions());
// { locale: 'de-DE', usage: 'sort', sensitivity: 'variant',
// ignorePunctuation: false, collation: 'standard',
// numeric: true, caseFirst: 'upper' }
// Vorab prüfen, ob Locales unterstützt werden
const supported = Intl.Collator.supportedLocalesOf(['de-DE', 'tlh', 'fr-FR']);
console.log(supported); // ['de-DE', 'fr-FR'] (Klingonisch nicht unterstützt)
// Wichtig · Fallstricke
Performance: Ein Intl.Collator-Objekt sollte einmal erstellt und wiederverwendet werden, da die Initialisierung (Laden der Locale-Daten) aufwändig ist. Das Binden der compare-Methode ist nicht notwendig, da sie intern den Collator referenziert.
Locale-Fallback: Wird eine nicht unterstützte Locale angegeben, greift die API automatisch auf die nächstpassende unterstützte Locale zurück. Mit Intl.Collator.supportedLocalesOf() lässt sich dies vorab prüfen.
Unicode-Kollationserweiterungen: Locale-Tags können Erweiterungsschlüssel enthalten, z. B. 'de-DE-u-co-phonebk' für Telefonbuch-Sortierung (ä wird wie ae sortiert). Die gleiche Wirkung erzielt man über die Option collation: 'phonebk'.
Vergleich mit String.prototype.localeCompare(): localeCompare ist praktisch für Einzelvergleiche, intern erstellt es aber bei jedem Aufruf implizit einen Collator. Für Sortierungen großer Arrays ist die explizite Verwendung von Intl.Collator deutlich schneller.