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
как насчет этого http://jsfiddle.net/Tw6xt/64/? – Sushil