JavaScript: сортировка массива объектов по украинским буквам - PullRequest
3 голосов
/ 28 января 2012

У меня есть массив объектов:

var countries = [
    {'id': 35, 'name': 'Перу'},
    {'id': 45, 'name': 'Індія'},
    {'id': 55, 'name': 'Єгипет'},
    {'id': 65, 'name': 'Албанія'},
]

Мне нужно отсортировать по name. Вот мой алгоритм:

function mySort(s1, s2) {
    return s1.name.toString().localeCompare(s2.name.toString());
}

var sorted = countries.sort(mySort);

// result (incorrect)
sorted = [
    {'id': 55, 'name': 'Єгипет'},
    {'id': 45, 'name': 'Індія'},
    {'id': 65, 'name': 'Албанія'},
    {'id': 35, 'name': 'Перу'},
]

// must be
sorted = [
    {'id': 65, 'name': 'Албанія'},
    {'id': 55, 'name': 'Єгипет'},
    {'id': 45, 'name': 'Індія'},
    {'id': 35, 'name': 'Перу'},
]

Что я делаю не так?

Вот пример jsfiddle и скриншот моего результата в jsfiddle.

enter image description here

Спасибо!

EDIT:

Я обнаружил, что только Google Chrome сортирует некорректно: FireFox и Opera делают это правильно.

Ответы [ 2 ]

3 голосов
/ 28 января 2012

Ваш код работает так, как вы ожидали для меня.

Это не имеет функционального значения, но вам не нужно вызывать .toString() для чего-то, что уже является String.То есть, вы можете упростить mySort до этого:

var mySort = function(s1, s2){
    return s1.name.localeCompare(s2.name);
}

(я также предпочитаю объявлять все функции как переменные, поскольку они все одинаковы в JavaScript - поэтому они должны обрабатываться согласованно.)

Однако, чтобы ответить, почему это может не сработать для вас, за http://msdn.microsoft.com/en-us/library/windows/apps/62b7ahzy%28v=vs.94%29.aspx (что интересно, страница MDN ничего об этом не говорит) - выделено мое:

localeCompare выполняет чувствительное к локали сравнение строк stringVar и stringExp и возвращает -1, 0 или +1, в зависимости от порядка сортировки системного языкового стандарта по умолчанию .

Если вы хотите что-то, что будет сортировать только по кодам символов, независимо от локали пользователя, вы можете использовать это вместо:

var mySort = function(s1, s2){
    if(s1 == s2){
      return 0;
    }
    return s1.name > s2.name;
}

Это будет сортировать последовательно, независимо отнастроек / предпочтений клиента или пользователя - но он также возвращает результаты, которые вы классифицировали как неправильные.


Редактировать : Как вы уже упоминали, наблюдаемое вами поведениеЭта проблема известна в Google Chrome и, как представляется, известна в Chrome и отслеживается по http://code.google.com/p/v8/issues/detail?id=459.

.
0 голосов
/ 28 января 2012

Попробуйте это:

var sorted = countries.sort(function(a, b) { return a.name.localeCompare(b.name) });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...