2015-06-23 4 views
0

Я пытаюсь сортировать массив по годам и месяцам
это мой вход:Сортировка массива Дата по годам и месяцам

var MyArray = ["2015-Jun", "2014-Nov", "2015-Dec", "2014-Aug", "2015-May"]; 

Я хочу, чтобы этот вывод:

[ "2014-Aug", "2014-Nov", "2015-May", "2015-Jun", "2015-Dec" ] 

I нашел этот пример: http://jsfiddle.net/Tw6xt/63/
Он почти работает. выход:

2014-May,2015-Jun,2015-Dec,2014-Aug,2014-Nov 

Что я делаю неправильно?

+0

как насчет этого http://jsfiddle.net/Tw6xt/64/? – Sushil

ответ

2

setDate() метод, который вы используете, устанавливает день месяца (от 1 до 31) и даст вам неожиданный результат, так как вы передаете ему год «2015».

неправильно: ad.setDate(as[0]);

Что вам нужно сделать, это использовать метод setFullYear() вместо этого.

ad.setFullYear(as[0]);

http://jsfiddle.net/Tw6xt/65/

HTML

<div>Before sort: <span id="before"></span></div> 
<div>After sort: <span id="after"></span></div> 

JS

var MyArray = ["2015-Jun", "2014-May", "2015-Dec", "2014-Aug", "2014-Nov"]; 
document.getElementById("before").innerHTML = String(MyArray); 

(function() { 

    MyArray.sort(function (a,b) { 
     var ad = new Date(), 
     bd = new Date(), 
     months = { 
      Jan: 0, Feb: 1, Mar: 2, Apr: 3, May: 4, Jun: 5, 
      Jul: 6, Aug: 7, Sep: 8, Oct: 9, Nov:10, Dec:12 
     }; 

     var as = a.split('-'), 
      bs = b.split('-'); 

     ad.setFullYear(as[0]); 
     ad.setMonth(months[as[1]]); 
     bd.setFullYear(bs[0]); 
     bd.setMonth(months[bs[1]]); 

     return ad - bd; 
    }); 
})(); 

document.getElementById("after").innerHTML = String(MyArray); 

ВЫВОД

Before sort: 2015-Jun,2014-May,2015-Dec,2014-Aug,2014-Nov 
After sort: 2014-May,2014-Aug,2014-Nov,2015-Jun,2015-Dec 
+0

Спасибо большое! оно работает! – Thiago

1

Я бы изменить вид на что-то вроде этого:

MyArray.sort(function (a,b) { 
    var as = a.split('-'), 
     bs = b.split('-'); 
    if(parseInt(as[0])<parseInt(bs[0])){ 
     if(months[as[1]]<months[bs[1]]) 
      return -1; 
     else if(months[as[1]]>months[bs[1]]) 
      return 1; 
     else 
      return 0; 
    }else if(parseInt(as[0])>parseInt(bs[0])){ 
     return 1; 
    } 
    return 0; 
}); 

Это будет первый заказ на год, заказ на месяц, с выхода: 2014-май 2014-август, 2014-ноябрь, 2015-Jun, 2015-Dec

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