2011-08-02 11 views
18

Istnieje wiele przykładów do sortowania jakąś tablicę JSON jakimś obiektem (Ie „tytuł”) używamy porównać funkcję jak ten:javascript sort z unicode

function sortComparer(a, b) { 
     if (a.title == b.title) 
      return 0; 
     return a1 > b1 ? 1 : -1; 
    } 

Problem polega na tym, że serbskiego alfabetu łacińskiego kolejność wygląda jak "A, B, C, C, C, D, ..." Podczas korzystania z sortComparer powyżej otrzymuję D posortowane przed "Č" lub "Ć". Każdy pomysł, jak sortować respektując obecny język kultury?

+0

Jednym ze sposobów byłoby zastąpić inne postacie z ich odpowiedniki ASCII. –

+0

Nie jesteś pewien, co myślisz. Jedyny sposób, w jaki przychodzę na myśl, to zdefiniowanie tablicy takich liter jak: var letters = {'a', 'b', 'c', 'č', 'ć', ...} oraz w funkcji sortComparer porównywanie indeksów . Wadą tego podejścia jest to, że musimy napisać taką tablicę dla każdej kultury, która nie jest angielska. –

+1

Javascript nie obsługuje algorytmu sortowania Unicode, więc jesteś w zasadzie hosed. Nie można używać sortowania punktów kodowych i uzyskać niczego rozsądnego. Aby otrzymać alfabetyczny sort, potrzebujesz UCA. – tchrist

Odpowiedz

22

Jeśli locale w systemie jest ustawiony prawidłowo, a następnie można użyć localeCompare metodę zamiast większy niż operator, aby porównać łańcuchy - ta metoda jest zorientowana lokalnie.

function sortComparer(a,b){ 
    return a.title.localeCompare(b.title) 
}; 
+2

To zadziała tylko wtedy, gdy ustawione jest ustawienie regionalne.Każda metoda przekazywania kultury wraz z porównywalną wartością? –

+0

Nie można ustawić lokalizacji za pomocą skryptu, jest ona definiowana przez przeglądarkę lub - w zależności od przeglądarki - dziedziczona po systemie operacyjnym. – Andris

+3

Znalazłem pełne rozwiązanie tutaj http://stackoverflow.com/questions/3630645/how-to-compare-utf-8-strings-in-javascript –

1

Czy próbowałeś struny localeCompare() funkcję:

function sortComparer(a, b) { 
    return a.title.localeCompare(b.title); 
} 

Zastrzeżenie: nie zostały faktycznie testowany, aby zobaczyć co localeCompare() robi z tymi nieanglojęzycznych znaków i MDN nie mówi, albo. (To nie znaczy, że toLocaleLowerCase() szanuje bieżące locale, więc miejmy nadzieję, że localeCompare() byłaby taka sama, ale jednak ...)

0

do sortowania tablicę z niestandardowych ustawień wykonaj następujące czynności:

  1. Utwórz tablicę z niestandardowej kolejności alfabetów:

    var alphabets = ["A", "B", "C", "Č", "Ć", "D","Dž","Đ","E","F","G","H","I","J","K","L","Lj","M","N","Nj","O","P","R","S", "ÛŒ","T","U","V","Z","Ž"];

  2. utworzyć listę testu array:

    var testArrray = ["B2","D6","A1","Ć5","Č4","C3"];

  3. Tworzenie nazwy funkcji sortowania:

    function OrderFunc(){ 
          testArrray.sort(function (a, b) { 
           return CharCompare(a, b, 0); 
          }); 
         } 
    
  4. utworzyć funkcję CharCompare (index: sort "AAAB" przed "AAAC"):

    function CharCompare(a, b, index) { 
        if (index == a.length || index == b.length) 
         return 0; 
        //toUpperCase: isn't case sensitive 
        var aChar = alphabets.indexOf(a.toUpperCase().charAt(index)); 
        var bChar = alphabets.indexOf(b.toUpperCase().charAt(index)); 
        if (aChar != bChar) 
         return aChar - bChar 
        else 
         return CharCompare(a,b,index+1) 
    

    }

  5. połączeń OrderFunc do sortowania tablicy testArray (wynikiem będzie: A1, B2, C3, Č4, Ć5, D6).

Test Online

Powodzenia

+0

@ TheChetan. jest to funkcja niestandardowego zlecenia i możesz zarządzać wszystkimi alfabetami, które chcesz sortować. na przykład rosyjski alfabet ma 33 znaki, perski 32 znaki i tak dalej. –