2014-02-28 2 views
0

Я хотел бы отсортировать массив со строками в алфавитном порядке (независимо от заглавных или нижних букв).
Например, B, C, A должен стать A, B, C. < Бр /> Но поскольку .sort чувствителен к регистру (что-то с ASCII) он становится A, C, B < Бр />jquery .sort case sensitive

var myArray = [ 'b', 'A', 'C' ]; 
myArray.sort(); 
console.log(myArray); 

Ссылка на скрипку: http://jsfiddle.net/x93N8/

Как это исправить?

ответ

2

Вы должны строчные буквы строк при сравнении их в функции сортировки, как это:

var myArray = [ 'b', 'A', 'C' ]; 
myArray.sort(function(a,b){ 
    var alc = a.toLowerCase(), blc = b.toLowerCase(); 
    return alc > blc ? 1 : alc < blc ? -1 : 0; 
}); 

Цитирую ECMAScript 5 спецификации:

15.4.4.11 Array.prototype.sort (comparefn)
Элементы этого массива rted. Сорт не обязательно стабильный (то есть элементы, которые сравниваются равными, необязательно остаются в их первоначальном порядке). Если comparefn не является неопределенным, это должна быть функция, которая принимает два аргумента x и y и возвращает отрицательное значение, если x < y, ноль, если x = y, или положительное значение, если x> y.

Вы можете найти полный ECMAScript спецификации здесь: http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf и прочитать все о сортировке на странице 140.

Вы также можете прочитать о методе сортировки здесь: https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/sort

Вы можете увидеть обновленную скрипку здесь: http://jsfiddle.net/x93N8/2/

3

Вы можете сделать это:

myArray.sort(function(a,b){ 
    a = a.toLowerCase(); b = b.toLowerCase(); 
    return a>b ? 1 : a==b ? 0 : -1; 
}); 
+1

Это противоречит спецификациям, в которых говорится, что функция сортировки должна возвращать больше нуля, нулевое значение или меньшее, чем нулевое значение, в зависимости от сравнения. ИМО мы не должны советовать людям создавать ленивые реализации, подобные этому. –

+0

@MartinJespersen: +1 к вашему комментарию. (Я также процитировал некоторые спецификации здесь, но, видимо, вы сделали то же самое в своем ответе ниже, так что +1 к вашему ответу :)) – DCoder

0
myArray.sort(
    function(a, b) { 
    if (a.toLowerCase() < b.toLowerCase()) return -1; 
    if (a.toLowerCase() > b.toLowerCase()) return 1; 
    return 0; 
    } 
); 

аренды обратите внимание, что я первоначально написал это, чтобы проиллюстрировать технику, а не имеющие производительность в виду , Также см. Ответ @ Ивана Кречетова для более компактного решения.