JavaScript/Objekte/String/localeCompare

Aus SELFHTML-Wiki
Wechseln zu: Navigation, Suche

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:

Sortier-Callback mit Intl.Compare
if (localeCompared) {
  data.sort(new Intl.Collator("de-DE").compare);
  localeCompared.textContent = data.join(", ");
}

Weblinks

Referenzen:

  1. Wikipedia: Alphabetische Sortierung in Deutschland (DIN 5007)