Compararea șirurilor cu Int.Collator
Pentru compararea șirurilor ținând cont de specificul limbii se utilizează tipul Collator. Pentru acesta, tipul Collator oferă metoda compare(), care acceptă două șiruri ca parametri:
collator.compare(string1, string2)
Metoda compare returnează una dintre cele trei valori numerice:
- 1, dacă primul șir este "mai mare" decât al doilea (primul șir se află după al doilea șir în ordinea lexicografică)
- -1, dacă al doilea șir este "mai mare" decât primul (primul șir se află înaintea celui de-al doilea)
- 0, dacă ambele șiruri sunt egale
Exemplu de comparare:
const collator = new Intl.Collator("ro-RO");
console.log(collator.compare("b", "a")); // 1
console.log(collator.compare("b", "b")); // -1
console.log(collator.compare("b", "c")); // -1
console.log(collator.compare("b", "b")); // 0
console.log(collator.compare("lume", "lumina")); // 1
console.log(collator.compare("lume", "luna")); // -1
console.log(collator.compare("lume", "lume")); // 0
Configurarea comparării
Principiul comparării șirurilor este determinat de obiectul de configurare, care este transmis constructorului Int.Collator ca al doilea parametru și care definește următoarele proprietăți:
- localeMatcher: reprezintă algoritmul folosit pentru selectarea localei. Poate lua două valori: "lookup" și "best fit" (implicit). Valoarea lookup presupune utilizarea unui algoritm definit în standard. Valoarea best fit folosește localizarea oferită de mediul de execuție
- usage: specifică dacă compararea șirurilor va fi folosită pentru sortare sau căutare. Valorile posibile sunt "sort" (pentru sortare) și "search" (pentru căutare - implicit)
- sensitivity: specifică ce simboluri trebuie considerate inegale. Valorile posibile:
1) "base": șirurile sunt considerate inegale dacă diferă prin literele de bază. Exemplu: a ≠ b, a = á, a = A. 2) "accent": șirurile sunt considerate inegale dacă diferă prin literele de bază sau semnele diacritice. Exemplu: a ≠ b, a ≠ á, a = A. 3) "case": șirurile sunt considerate inegale dacă diferă prin literele de bază sau majusculă/minusculă. Exemplu: a ≠ b, a = á, a ≠ A. 4) "variant": șirurile sunt considerate inegale dacă diferă prin literele de bază, majusculă/minusculă sau semnele diacritice. Exemplu: a ≠ b, a ≠ á, a ≠ A. Implicit
- ignorePunctuation: dacă trebuie să se ignore punctuația. Acceptă valorile true (punctuația este ignorată) și false (nu este ignorată, implicit)
- numeric: specifică dacă șirurile trebuie comparate ca numere (de exemplu, "1" < "5" < "10"). Acceptă valorile true și false (implicit)
- caseFirst: specifică dacă trebuie luat în considerare cazul primei litere. Acceptă valorile "upper", "lower" sau "false" (implicit)
De exemplu, să nu ținem cont de majuscule/minuscule la comparare:
const standardCollator = new Intl.Collator("ro-RO");
console.log(standardCollator.compare("Casa", "casa")); // 1 - șirurile nu sunt egale
const baseCollator = new Intl.Collator("ro-RO", {sensitivity: "base"});
console.log(baseCollator.compare("Casa", "casa")); // 0 - șirurile sunt egale
Sortarea șirurilor
Metoda compare() este utilă pentru sortarea unui array de șiruri. În special, metoda sort() a obiectului array acceptă o funcție de sortare sau comparare, care apoi compară perechi de elemente ale array-ului respectiv și, astfel, realizează sortarea:
const collator = new Intl.Collator("ro", {usage: "sort"});
const people = ["Tom", "Bob", "Sam", "Alice", "Kate"];
people.sort(collator.compare); // sortăm array-ul
console.log(people); // ["Alice", "Bob", "Kate", "Sam", "Tom"]
Acest exemplu demonstrează cum Intl.Collator poate fi folosit pentru a sorta un array de nume într-o manieră care respectă regulile lingvistice specifice limbii indicate.