Computer Keyboard - Głównie JavaScript

Głównie JavaScript

rss feed icon

by

Jak posortować tablicę napisów z polskimi znakami

Zdjęcie wzróru z kwadratowych przegórdek
źródło maxpixel.net, licencja CC0 Public Domain

Będzie to bardzo krótki wpis. Możliwe, że będzie to pierwszy z serii. Przedstawię w nim jak posortować tablicę alfabetycznie, która zawiera ciągi z polskimi znakami (ang. array of strings).

W języku JavaScript mamy do sortowania tablic służy funkcja sort(), która działa tak:

['Baro', 'Ąmar', 'Ęla', 'Ale'].sort();
// ["Ale", "Baro", "Ąmar", "Ęla"]

NOTE: funkcja zwraca, ale też sortuje, tablicę w miejscu, więc aby nie stracić oryginalnej tablicy należy ją skopiować, można użyć arr.slice().sort() lub [...arr].sort().

Nie jest to dokładnie to, o co nam chodzi. W poprawnie posortowanej tablicy „Ąmar” powinno być drugie na liście (przed „Baro”). Takie posortowanie naszych ciągów znaków wynika z faktu, że brane są pod uwagę kody znaków (ang. CodePoints), które w tablicy znaków nie są w tych samych miejscach, co w Polskim alfabecie. Polskie znaki są na końcu, (zobacz tabelę Unicode).

A oto rozwiązanie, które poprawnie posortuje tablicę:

['Baro', 'Ąmar', 'Ęla', 'Ale'].sort((a,b) => a.localeCompare(b));
// ["Ale", "Ąmar", "Baro", "Ęla"]

Tak samo można posortować obiekty po jakimś polu (np. po nazwisku):

let arr = [{name: 'Baro'}, {name: 'Ąmar'}, {name: 'Ęla'}, {name: 'Ale'}];
arr.sort((a,b) => a.name.localeCompare(b.name));

Wsparcie tego API jest bardzo duże, bo 99%. Wspiera je w pełni nawet IE11 (zobacz Can I Use). Dlatego nie ma powodu, aby zawsze nie sortować tablicy z uwzględnieniem znaków z aktualnego języka (ang. locale).

Warto też zajrzeć na stronę MDN, gdzie jest pełna dokumentacja do funkcji localeCompare, która oprócz prostego wywołania, ma też masę opcji.

źródło strony (aby zobaczyć kod na GitHubie, musisz kliknąć przycisk raw)
Komentarze

Hasło, które podasz umożliwi ponowne zalogowanie się i np. usunięcie komentarza, jest dobrowolne. Email jest szyfrowany i używany do wysyłania powiadomień o odpowiedziach do komentarzy oraz do pobierania awatara dzięki usłudze Gravatar.com.