2016-01-06 3 views
1

Так я попытка взять массив какПочему эта сортировка не правильная?

["2015/10","2015/1","2015/6","2015/12","2015/3","2015/7","2015/2","2016/1","2015/8","2015/5","2015/11","2015/9","2015/4"] 

, где XXXX/YY является год/месяц формат и сортировать его от наименьшего к наибольшему.

Покушение, используя https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort в качестве ссылки:

month_keys.sort(function(x,y){ 
    var partsX = x.split('/'), partsY = y.split('/'); 
    return partsX[0] < partsY[0] ? -1 : (partsX[1] < partsY[1] ? -1 : 1); 
})... 

и это дает мне

["2015/1","2015/11","2016/1","2015/10","2015/12","2015/2","2015/3","2015/5","2015/5","2015/6","2015/7","2015/8","2015/9"] 

в примере массива я дал в самом начале. Что я делаю не так?

ответ

5

Вы сравниваете строки, а не цифры. При сравнении строк они сравнивают char по char, поэтому все, начиная с 1, предшествует чему-то начинающему, например. с 2. Даже если это 10 против 2.

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

var partsX = +x.split('/'), 
    partsY = +y.split('/'); 

Вы также должны фиксировать фактическое сравнение:

if (partsX[0] < partsY[0]) return -1; 
else if (partsX[0] > partsY[0]) return 1; 
else if (partsX[1] < partsY[1]) return -1; 
else if (partsX[1] > partsY[1]) return 1; 
else return 0; 
+0

Вы уверены? '' 1000 '<' 2'' истинно. – ThiefMaster

+0

Правда, я действительно не читал эту строку. – ThiefMaster

-1

У вас есть строки, представляющие числа. Просто поставить «+» перед переменным, чтобы преобразовать его в номер:

return +partsX[0] < +partsY[0] ? -1 : (+partsX[1] < +partsY[1] ? -1 : 1); 

Я работаю ...

+0

Есть ли разница между использованием '+' и использованием 'parseInt'? –

+0

+ является одним из этих аккуратных ярлыков js для преобразования строк, содержащих числа. parseInt дает вам больше мощности, позволяя вам преобразовывать двоичные, шестнадцатеричные или октавные, а не только десятичные числа. – chapelo

Смежные вопросы