JavaScript/Objekte/String/localeCompare
Die Methode localeCompare() von String.prototype
vergleicht Zeichenketten und berücksichtigt dabei die Besonderheiten eines Locales.
Diese Methode wurde mit ECMAScript 3 eingeführt. ECMAScript 2015 (ES6) fügte die Parameter locale
und options
hinzu sowie die Vorschrift, den mit ECMA-402 definierten Collator-Vergleich zu nutzen, sofern die JavaScript-Engine diesen enthält.
Syntax
const str1 = "zeichenkette 1", str2 = "zeichenkette 2"; ergebnis = str1.localeCompare(str2); ergebnis = str1.localeCompare(str2, locale, options);
Das Ergebnis von localeCompare ist eine Zahl, die die Reihenfolge von str1
und str2
unter Berücksichtigung von Locale und Vergleichsoptionen beschreibt. Welche Werte man als locale<code> und <code>options
übergeben kann, wird im Zusammenhang mit Intl.Collator beschrieben.
ergebnis < 0
|
bedeutet str1 < str2
|
ergebnis == 0
|
bedeutet str1 == str2
|
ergebnis > 0
|
bedeutet str1 > str2
|
Der klassische Stringvergleich, der die Operatoren <
, ==
und >
verwendet, vergleicht Zeichenketten lediglich an Hand ihrer Unicode Codepoints und ist deshalb nur für die englische Sprache geeignet.
if (normal) {
data.sort();
normal.textContent = data.join(", ");
}
if (localeCompared) {
data.sort((a, b) => a.localeCompare(b, "de-DE"));
localeCompared.textContent = data.join(", ");
}
Im Beispiel werden Wörter mit und ohne Umlaute sortiert. Ohne locale-basierenden sort
-Callback wird der Umlaut 'Ä' hinter Z eingereiht. Mit diesem Callback werden hingegen die für das Locale geltenden Regeln verwendet.
Für die Details sei auf den Intl.Collator
-Artikel und die Wikipedia verwiesen, weil das de
Locale zwei unterschiedliche Sortiersets (collation) enthält: eor
(european ordering rules) und phonebk
(Telefonbuch). Und weil es sonst zu einfach wäre, unterscheidet sich phonebk
in Deutschland und Österreich![1]
localeCompare vs Intl.Collator
Wenn Sie nur einzelne Vergleiche durchführen möchten, können Sie localeCompare
verwenden. Für häufig wiederholte Sortieraufgaben, wie in einem Sortier-Callback, ist es hingegen effizienter, ein Intl.Collator
-Objekt zu erzeugen und dessen compare-Methode zu verwenden, weil localeCompare
bei jedem Aufruf ein neues Collator-Objekt erzeugt. Der besondere Vorteil der compare
-Methode ist, dass sie „gebunden“ ist, man kann sie also ohne Probleme als Argument weitergeben, ohne dass sie ihre Bindung an das Collator-Objekt verliert. Sie müssen also keine Hilfsfunktion schreiben, die den Collator in einer Closure mitschleppt.
Im obigen Beispiel würde man besser schreiben:
if (localeCompared) {
data.sort(new Intl.Collator("de-DE").compare);
localeCompared.textContent = data.join(", ");
}
Weblinks
- ECMA: localecompare
- MDN: String.localeCompare
Referenzen: