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

Array.sort() не сортирует числа правильно

В Chrome 14 и Firefox 5 (не проверялись другие браузеры) следующий код не сортирует числа правильно:

<script>
a = new Array();
a.push(10);
a.push(60);
a.push(20);
a.push(30);
a.push(100);


document.write(a.sort())
</script>

Он возвращает 10,100,20,30,60

Я пробовал разные числа, и он всегда действует так, как будто 0s не существует и сортирует числа в противном случае. Кто-нибудь знает, почему?

4b9b3361

Ответ 1

Я пробовал разные числа, и он всегда действует так, как будто 0s не существует и сортирует числа в противном случае. Кто-нибудь знает, почему?

Вы получаете лексикографический вид (например, конвертируете объекты в строки и сортируете их в порядке словаря), который является поведением сортировки по умолчанию в Javascript:

https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/sort

array.sort([compareFunction])

Параметры

compareFunction

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

В спецификации ECMAscript (нормативная ссылка для общего Javascript), ECMA-262, 3-е изд., раздел 15.4.4.11, порядок сортировки по умолчанию лексикографичен, хотя они не выходят и говорят об этом, вместо этого дают шаги для функции концептуального сортирования, которая при необходимости вызывает данную функцию сравнения, в противном случае сравнивая аргументы при преобразовании в строки:

13. If the argument comparefn is undefined, go to step 16.
14. Call comparefn with arguments x and y.
15. Return Result(14).
16. Call ToString(x).
17. Call ToString(y).
18. If Result(16) < Result(17), return −1.
19. If Result(16) > Result(17), return 1.
20. Return +0.

Ответ 2

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

Это может сбить с толку.... проверить эту ссылку вне.

Ответ 3

Сортировка по умолчанию для массивов в Javascript - это алфавитный поиск. Если вы хотите численный сортировать, попробуйте что-то вроде этого:

var a = [ 1, 100, 50, 2, 5];
a.sort(function(a,b) { return a - b; });

Ответ 5

попробуйте следующее:

a = new Array();
a.push(10);
a.push(60);
a.push(20);
a.push(30);
a.push(100);
a.sort(Test)

document.write(a);


function Test(a,b)
{
    return a > b ? true : false;
}