Подтвердить что ты не робот

Underscore.js Нечувствительная к регистру сортировка

Имея некоторые незначительные проблемы, пытающиеся получить underscore.js для сортировки без учета регистра. У меня есть массив объектов и хотел бы иметь возможность сортировать по имени свойства.

Использование метода быстрого доступа sortBy

iteratee также может быть строковым именем свойства для сортировки (например, длина).

Массив для сортировки:

var array = [{ name: 'test_1234', description: 'zzaaa bb cc'}, 
         { name: 'zz1111', description: 'ZAAbbbcc'}, 
         { name: 'TEST', description: '4422'}, 
         { name: '1a2929', description: 'abcdef'}, 
         { name: 'abc', description: 'Full description'}, 
         { name: 'GGGGH', description: '123456'}];

Сортировка с использованием этого метода sortProperty = 'name', результат помещает в верхний регистр до нижнего регистра.

var sorted = _.sortBy(array, sortProperty);

1a2929 - abcdef
GGGGH - 123456
TEST - 4422
abc - Full description
test_1234 - zzaaa bb cc
zz1111 - ZAAbbbcc

Я предполагаю, что это связано с чувствительностью к регистру, но я не могу понять, как изменить имена в массиве на нижний регистр и сравнить этот способ.

Любая помощь очень ценится.

Изменить: Как указано, вы передаете имя или функцию, поэтому просто скорректируйте функцию, чтобы вернуть, какое поле сортировать: http://jsfiddle.net/rjaqp1vg/5/

4b9b3361

Ответ 1

Имя для сортировки может быть именем поля ИЛИ функцией, поэтому передайте функцию, которая выполняет преобразование в нижнем регистре.

var sorted = _.sortBy(array, function (i) { return i.name.toLowerCase(); });

должен сделать трюк.

Ответ 2

Не используйте для этого _.sortBy. Правильный способ сортировки строк в алфавитном порядке - использовать localeCompare. Вот пример в чистом Javascript:

['Z', 'A','z','á', 'V'].sort(function(a, b){
   return a.localeCompare(b, undefined /* Ignore language */, { sensitivity: 'base' }) 
});

См. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/localeCompare.