2014-02-11 4 views
3

Заметили что-то потенциально странное с использованием метода JavaScript sort(). Учитывая следующий массив:Метод сортировки заглавных букв JavaScript сортировать по:

var arr = ['Aaa', 
'CUSTREF', 
'Copy a template', 
'Copy of Statementsmm', 
'Copy1 of Default Email Template', 
'Copy11', 
'Cust', 
'Statements', 
'zzzz']; 

Calling сортировку массива:

console.log(arr.sort());

Урожайность:

["Aaa", "CUSTREF", "Copy a template", "Copy of Statementsmm", "Copy1 of Default Email Template", "Copy11", "Cust", "Statements", "zzzz"] 

Является ли это правильно? то есть. CUSTREF указан первым, это из-за его заглавных букв?

+0

Вот как [ 'сортировки()'] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort) работает. Символы сортируются по их значениям Unicode. – Teemu

+0

Да. '' U "<" o "'. – Philipp

+0

Возможный дубликат [Как выполнить сортировку без учета регистра в Javascript?] (Http://stackoverflow.com/questions/8996963/how-to-perform-case-insensitive-sorting-in-javascript) – Liam

ответ

6

Это правильно. Строки сортируются двоично, используя порядковые значения самих символов.

Для регистронезависимого рода, попробуйте следующее:

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

Хорошо ..., которое два chumps downvoted этот ответ только сейчас, и почему? –

1

Да, Он имеет более высокое значение Юникода. (Это = в «U» в первом слове)

вы maybetter использовать

.sort(function(a,b) { return (a.toLowerCase() < b.toLowerCase()) ? -1 : 1;});

+4

НЕПРАВИЛЬНО. Функция sort должна возвращать * номер *, а не логическое значение. –

+1

+ отсутствующие аргументы 'a' и' b'. – Teemu

+0

@Teemu Pfft, это тоже. Логическое возвращение было настолько ослепительным для меня, что я полностью упустил недостающие аргументы! XD –

0

, если вы посмотрите на их способ кодировки символов (например, ASCII таблицы), вы увидите, что заглавные буквы имеют более низкие значения, которые нижнего регистра один, так что да - это из-за заглавных букв

0

с U (U + 0055) имеет меньшую Unicode значение, чем o (U + 006F), чувствительный к регистру sort всегда будет место U перед тем o , Для регистронезависимого sort, вы должны попробовать:

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

Вы правильны, это из-за заглавные буквы. Если вы сортируете строки, которые могут иметь не ASCII-символы, такие как ä и ö, вы должны использовать String.localeCompare(). Это также устраняет проблему с большой буквы.

arr.sort(function (a, b) { 
    return a.localeCompare(b); 
}); 
Смежные вопросы