Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

javascript sort with unicode

There are a lot of examples for sorting some JSON array by some property (i.e. 'title') We are using compare function like this one:

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

Problem is that Serbian Latin alphabet order looks like "A, B, C, Č, Ć, D,..." When using sortComparer above I am getting D sorted before "Č" or "Ć". Any idea how to sort respecting current culture language?

like image 629
Andrej Kaurin Avatar asked Aug 02 '11 08:08

Andrej Kaurin


2 Answers

If the locale in your system is set correctly then you can use localeCompare method instead of greater-than operator to compare the strings - this method is locale aware.

function sortComparer(a,b){     return a.title.localeCompare(b.title) }; 
like image 94
Andris Avatar answered Oct 01 '22 01:10

Andris


For sorting an array with custom setting do as following:

  1. Create an array with a custom order of alphabets:

    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. Create a list of test array:

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

  3. Create a sort function name:

    function OrderFunc(){           testArrray.sort(function (a, b) {               return CharCompare(a, b, 0);           });       } 
  4. create the CharCompare function(index: sort "AAAB" before "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. Call OrderFunc for sorting the testArray(the result will be : A1,B2,C3,Č4,Ć5,D6).

Test Online

Good Luck

like image 44
Iman Bahrampour Avatar answered Oct 01 '22 03:10

Iman Bahrampour