Почему функция сортировки JavaScript не работает хорошо? - PullRequest
12 голосов
/ 23 мая 2011

Этот простой javascript

var x = new Array();
x[0] = 2.73;
x[1] = 11.17;
x[2] = 3.12
x.sort();

for(var i in x)
    alert(x[i]);

дает результаты: 11.17, 2.73, 3.12 вместо 2.73, 3.12, 11.17.

Почему это так и как я могу это исправить?

Заранее спасибо!

Ответы [ 5 ]

16 голосов
/ 23 мая 2011

Это сортировка по алфавиту, попробуйте передать свою собственную функцию сортировки:

var x = new Array();
x[0] = 2.73;
x[1] = 11.17;
x[2] = 3.12;

numberSort = function (a,b) {
    return a - b;
};

x.sort(numberSort);

for(var i in x) {
    alert(x[i]);
}
9 голосов
/ 23 мая 2011

По умолчанию Array.sort будет сортировать по алфавиту (лексографически) ... но вы можете предоставить свою собственную функцию. Попробуйте:

x.sort(function(a, b) { return a > b ? 1 : -1});
3 голосов
/ 23 мая 2011

Между ними существующие ответы говорят вам все, но ни один из них не упоминает обе проблемы в вашем коде. Вот полный ответ:

Сортировка не выполняет то, что вы хотите, потому что сортировка по умолчанию является лексической (то есть элементы массива преобразуются в строки и сравниваются в алфавитном порядке). Вы можете предоставить собственную функцию сравнения для sort():

x.sort(function(a, b) {
    return a - b;
});

Во-вторых, for...in фактически не говорит вам ничего конкретного о том, правильно ли отсортирован ваш массив, потому что перечисление for...in не определено (хотя большинство, но не все браузеры делают в целом то, что вы ожидаете). Вместо этого используйте цикл for (как обычно для массивов):

for (var i = 0, len = x.length; i < len; ++i) {
    alert(x[i]);
}
1 голос
/ 23 мая 2011

Вы не выполняете итерацию правильно.Это должно быть:

for (var i = 0; i < x.length; i++) {
    alert(x[i]);
}

Когда вы используете for..in в javascript, это будет проходить через свойства объекта, и порядок итерации не определен.Вы также должны увидеть какой-то странный вывод, такой как все функции, определенные в классе Array.

0 голосов
/ 08 мая 2018

Функция Array.sort () обрабатывает свои элементы как строки и, если функция не передана в оператор sort (), она преобразует элементы в Unicode и сортирует.Поэтому рекомендуется передавать пользовательскую функцию сортировки при сортировке чисел.

function customSort(a, b){
     return a - b; 
}
console.log([-11,-2, 0 ,100].sort(customSort));

Эта функция customSort () отсортирует массив in_place в порядке возрастания.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...