String.prototype.localeCompare în JavaScript

Șiruri de caractere Toate browserele, Node.js

Compară două texte după regulile alfabetului unei limbi; util la sortarea cu diacritice.

Sintaxă
sir.localeCompare(altSir, limba, optiuni)

Ce face String.prototype.localeCompare

localeCompare returnează un număr negativ dacă textul vine înaintea celuilalt în ordinea alfabetică, pozitiv dacă vine după și 0 dacă sunt echivalente.

Spre deosebire de comparația cu <, care folosește codurile Unicode, localeCompare cunoaște regulile limbii: în română, „ș” vine după „s”, iar „ă” după „a”. Cu { sensitivity: "base" } ignoră diferențele de majuscule și accentele care, în limba aleasă, nu formează o literă separată.

Pentru multe comparații (de exemplu sortarea unei liste mari), un obiect Intl.Collator creat o singură dată este mai rapid.

Parametri

Parametru Descriere
altSir Textul cu care se compară.
limba Opțional. Codul limbii, de exemplu "ro".
optiuni Opțional. De exemplu { sensitivity: "base" } sau { numeric: true }.

Ce returnează

Un număr negativ, 0 sau pozitiv.

Exemple

Exemplul 1: Sortare corectă în română

const orase = ["Ștei", "Sibiu", "Arad", "Țăndărei", "Turda", "Brăila"];

console.log([...orase].sort());
console.log([...orase].sort((a, b) => a.localeCompare(b, "ro")));

Rezultat

[ 'Arad', 'Brăila', 'Sibiu', 'Turda', 'Ștei', 'Țăndărei' ]
[ 'Arad', 'Brăila', 'Sibiu', 'Ștei', 'Turda', 'Țăndărei' ]

Exemplul 2: Comparație fără diferența dintre majuscule

În română, „ș” este o literă separată de „s”, deci „Iași” și „Iasi” rămân diferite chiar cu sensitivity: "base". În engleză, „ș” este doar un „s” cu semn, iar textele sunt considerate egale.

console.log("ANA".localeCompare("ana", "ro"));
console.log("ANA".localeCompare("ana", "ro", { sensitivity: "base" }));
console.log("Iași".localeCompare("Iasi", "ro", { sensitivity: "base" }));
console.log("Iași".localeCompare("Iasi", "en", { sensitivity: "base" }));

Rezultat

1
0
1
0

Exemplul 3: Numere în interiorul textului

const fisiere = ["capitol10.txt", "capitol2.txt", "capitol1.txt"];

fisiere.sort((a, b) => a.localeCompare(b, "ro", { numeric: true }));
console.log(fisiere);

Rezultat

[ 'capitol1.txt', 'capitol2.txt', 'capitol10.txt' ]

Greșeli frecvente

  • Verifici rezultatul cu === -1 sau === 1. Standardul garantează doar semnul, nu valoarea exactă. Compară cu < 0 și > 0.
  • Sortezi nume românești cu sort() simplu și literele cu diacritice ajung la sfârșit.

Comenzi înrudite

  • sort: Ordonează elementele unui tablou. Modifică tabloul original.
  • Intl.Collator: Compară și sortează texte după alfabetul unei limbi; varianta rapidă a lui localeCompare.
  • toUpperCase / toLowerCase: Transformă tot textul în litere mari sau în litere mici.