2014-01-09 3 views
4

Это похоже на простой вид, но JavaScript дает неверный результат.Почему JavaScript не сортируется [5, 10, 1]?

Я делаю что-то неправильно или это языковая причуда?

[5, 10, 1] .sort();

[1, 10, 5]

+4

кажись отлично заказал для * лексического порядка *. – deceze

+3

Ненавижу цитировать Этвуд, но ... [первое правило программирования] (http://www.codinghorror.com/blog/2008/03/the-first-rule-of-programming-its-allways-your -fault.html). –

ответ

17

Javascript сортирует по алфавиту. Это означает, что «10» ниже «5», потому что «1» меньше «5».

Для сортировки числовых значений, которые нужно передать в численном компараторе, как это:

function sorter(a, b) { 
    if (a < b) return -1; // any negative number works 
    if (a > b) return 1; // any positive number works 
    return 0; // equal values MUST yield zero 
} 

[1,10, 5].sort(sorter); 

Или вы можете обмануть, передав простую функцию:

function sorter(a, b){ 
    return a - b; 
} 

[1, 10, 5].sort(sorter); 

Логика этой короткой функции является то, что компаратор должен возврат x>0 if a > b, x<0 if a < b и zero if a is equal to b. Так что в случае, если у вас есть

a=1 b=5 
a-b will yield negative(-4) number meaning b is larger than a 

a=5 b=1 
a-b will yield positive number(4) meaning a is larger than b 

a=3 b=3 
a-b will yield 0 meaning they are equal 
+0

Это слишком много кода! –

+0

@ KellyJAndrews где? Широко используется второй подход. Конечно, вы можете встроить его прямо и минимизировать, если вы предпочитаете размер> читаемость. –

+0

Я сделал свой пример в одной строке. Самое маленькое, что вы используете, - это 3. –

0

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

function sortNumber(a,b) { 
    return a - b; 
} 

var numArray = [140000, 104, 99]; 
numArray.sort(sortNumber); 
2

Вы должны передать функцию методу сортировки.

var points = [5, 10, 1]; 
points.sort(function(a,b){return a-b}); 

Here является рабочей скрипкой.

+0

. Кроме того, [это] (http://www.w3schools.com/jsref/jsref_sort.asp) - это школы W3C об этом , –

+0

Школы W3C - это плохой справочник – Jacob

+3

Это плохой рэп, но я думаю, что для простых основ, это точно. –

0

Вы можете попробовать:

[5, 10, 1].sort(function(a, b){ return a - b }) # print [1, 5, 10] 
0

вы можете попробовать

[5, 10, 1].sort(function(a,b){return a-b}) 
Смежные вопросы