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?

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)
};

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


Use The Intl.Collator like you will get perfect sorting result

function letterSort(lang, letters) {
  letters.sort(new Intl.Collator(lang).compare);
  return letters;
}

console.log(letterSort('gu', ['?','?','?']));
// expected output: Array ["a", "ä", "z"]

console.log(letterSort('sv', ['a','z','ä']));
// expected output: Array ["a", "z", "ä"]

More detail you can check here https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Collator