Przejdź do treści

Porównanie lokalne - localeCompare

W jaki sposób ułożyć tekst w porządku alfabetycznym uwzględniając polskie znaki diakrytyczne?

String.prototype.localeCompare(that)
Parametry:
String that - drugi tekst do porównania
Wartość:
Number - wartość porównania:
  • liczba mniejsza od zera - gdy bieżący tekst jest mniejszy niż that
  • zero - gdy oba teksty są równe
  • liczba większa od zera - gdy bieżący tekst jest większy niż that

Dwa teksty możemy porównać ze sobą za pomocą operatora < oraz >, ale wtedy porównywane są tak naprawdę ich kody liczbowe. W przypadku alfabetu łacińskiego wszystko jest w porządku. Jednak gdy będziemy próbowali porównać teksty zawierające znaki diakrytyczne, takie porównanie nie odzwierciedli prawidłowej kolejności występowania liter w narodowym alfabecie. Wady tej nie posiada funkcja String.prototype.localeCompare, która powinna uwzględnić domyślny język ustawiony w systemie operacyjnym użytkownika.

Przykład String.prototype.localeCompare

📋 Zaznacz kod

"abc".localeCompare("def") < 0; // true
"def" > "abc";                  // true
"def".localeCompare("abc") > 0; // true
 
"ą" < "b";                      // false
"ą".localeCompare("b"); < 0;    // true
"b" > "ą";                      // false
"b".localeCompare("ą") > 0;     // true
 
var chars = [
    " ", "`", "-", "=", "[", "]", "|", ";", "'", ",", ".", "/",
    "~", "!", "@", "#", "$", "%", "^", "&", "*", "(", ")", "{", "}", "\\", ":", "\"", "<", ">", "?",
    "1", "0", "2", "3", "5", "7", "4", "6", "8", "9",
    "n", "c", "a", "o", "b", "p", "d", "g", "q", "e", "m", "r", "h", "f", "s", "i", "l", "v", "w", "x", "j", "y", "u", "k", "z", "t",
    "N", "C", "A", "O", "B", "P", "D", "G", "Q", "E", "M", "R", "H", "F", "S", "I", "L", "V", "W", "X", "J", "Y", "U", "K", "Z", "T",
    "ż", "ó", "ł", "ć", "ę", "ś", "ą", "ź", "ń",
    "Ż", "Ó", "Ł", "Ć", "Ę", "Ś", "Ą", "Ź", "Ń"
];
var f = function (x, y) {
    return String.prototype.localeCompare.call(x, y);
};
chars.sort(f);
// np.: ["'", "-", " ", "!", "\"", "#", "$", "%", "&", "(", ")", "*", ",", ".",
//       "/", ":", ";", "?", "@", "[", "\\", "]", "^", "`", "{", "|", "}", "~",
//       "<", "=", ">", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9",
//       "a", "A", "ą", "Ą", "b", "B", "c", "C", "ć", "Ć", "d", "D", "e", "E",
//       "ę", "Ę", "f", "F", "g", "G", "h", "H", "i", "I", "j", "J", "k", "K",
//       "l", "L", "ł", "Ł", "m", "M", "n", "N", "ń", "Ń", "o", "O", "ó", "Ó",
//       "p", "P", "q", "Q", "r", "R", "s", "S", "ś", "Ś", "t", "T", "u", "U",
//       "v", "V", "w", "W", "x", "X", "y", "Y", "z", "Z", "ź", "Ź", "ż", "Ż"]

Komentarze #

  • Gandiexn
    Gandiexn

    10.06.2014 21:58
    "Póki co niestety zainteresowanie tą tematyką w Kursie jest niewielkie.".
    Bo póki co służy on bardziej jako ściągawka niż kurs.
    Zobacz więcej

  • Nitr0Skay
    Nitr0Skay

    10.06.2014 21:27
    kurshtml
    Co nie znaczy, że nikt z tego nie korzysta. Prędzej czy później zamierzam przeczytać wszystko to, co znajduje się na kurshtml.edu.pl ;D
    I również i ja lubię poczytać o takich ciekawostkach. Nie wiem, jak inni
    Zobacz więcej

  • Sławomir Kokłowski
    Sławomir Kokłowski

    10.06.2014 21:00
    Póki co niestety zainteresowanie tą tematyką w Kursie jest niewielkie.
    Zobacz więcej

  • Comandeer
    Comandeer

    10.06.2014 20:44
    a tak z czystej ciekawości - czy kurs będzie dalej rozwijany? i czy pojawią się w nim niedorzeczności z WHATWG (raczej w ramach ciekawostki :))?
    Zobacz więcej

  • Sławomir Kokłowski
    Sławomir Kokłowski

    10.06.2014 20:12
    tak
    Zobacz więcej

  • Nitr0Skay
    Nitr0Skay

    10.06.2014 20:09
    kurshtml
    Teraz dopiero załapałem. Proszę wybaczyć, mój błąd ;D
    @UP
    Zapewne dlatego, że drugi argument jest mniejszy od tego pierwszego (od początkowego indexu), dobrze rozumuję ? :)
    Zobacz więcej

  • Sławomir Kokłowski
    Sławomir Kokłowski

    10.06.2014 20:02
    Opis jest prawidłowy. Drugi parametr funkcji String.prototype.slice oznacza wartość indeksu, a nie liczbę znaków do wycięcia. Przykładowo poniższe wywołanie zwróci pusty string: [...]
    Zobacz więcej

  • Nitr0Skay
    Nitr0Skay

    10.06.2014 19:28
    "Parametry:
    Number start - pozycja znaku początkowego (domyślnie: 0)
    Number end - pozycja znaku po końcowym (domyślnie: długość tekstu)".
    Domyślam się, iż przy tym drugim, domyślną wartością powinno być: długość tekstu - pozycja początkowa
    Można text o długości 10 znaków wycinać od 3 znaku, ale...
    Zobacz więcej

Zobacz więcej komentarzy

Facebook