2010-08-23 2 views
1

Я пытаюсь сортировать массив из дат от последних до самых старых, и, к сожалению, list.sort (по умолчанию) сортирует только первое число. Мой массив выглядит следующим образом:Сортировка массива дня/месяца в Javascript

var MyArray = ["13 Jun", "09 Jun", "25 Aug", "30 Jun", "13 Aug"]; 

Я попытался сделать функцию для .sort в качестве ссылки, но и весь процесс несколько запутанной для меня. Может ли кто-нибудь помочь мне?

ответ

5

Вам придется разобрать строки в дата() объектов, которые были бы достаточно просто, если бы не было плохой реализации IE о дате строки синтаксического анализа. К счастью, вы можете использовать SETDATE() и setMonth() с согласованности между браузерами, оба принимают номера - 1-31 для SETDATE(), 0-11 для setMonth(). Настройка карты объектов для имен месяцев поможет.

Это работает для меня:

(function() { 
    // Set up our variables, 2 date objects and a map of month names/numbers 
    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 
     }; 

    MyArray.sort(function (a,b) { 
     // Split the text into [ date, month ] 
     var as = a.split(' '), 
      bs = b.split(' '); 

     // Set the Date() objects to the dates of the items 
     ad.setDate(as[0]); 
     ad.setMonth(months[as[1]]); 
     bd.setDate(bs[0]); 
     bd.setMonth(months[bs[1]]); 

     /* A math operation converts a Date object to a number, so 
      it's enough to just return date1 - date2 */ 
     return ad - bd; 
    }); 
})(); 
//-> ["09 Jun", "13 Jun", "30 Jun", "13 Aug", "25 Aug"] 

Я настроил пример для вас - http://jsfiddle.net/Tw6xt/

+1

Это прекрасно работает! спасибо – 2010-08-23 22:58:39

0

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

function sortDate (a,b) { 
    var aa = a.split(' '); 
    var bb = b.split(' '); 
    var months = { 
     Jan : 1, 
     Feb : 2, 
     Mar : 3 /* you do the rest ... */ 
    } 

    if (months[a[1]] > months[b[1]]) return 1; 
    if (months[a[1]] < months[b[1]]) return -1; 

    return parseInt(a[0],10) - parseInt(b[0],10); 
} 

MyArray.sort(sortDate); 
0

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

var MyArray = ["13 Jun", "09 Jun", "25 Aug", "30 Jun", "13 Aug"]; 
MyArray.sort(function (a, b) { 
    a = parseDate(a); 
    b = parseDate(b); 
    if (a < b) { 
      return 1; 
    } else if (a > b) { 
      return -1; 
    } else { 
      return 0; 
    } 
}); 
-1

Вот решение, которое не отвечает на любые константы.

var MyArray = ["13 Jun", "09 Jun", "25 Aug", "30 Jun", "13 Aug"]; 
var DateArray = []; 
var SortedArray = []; 
var dateBits; 
for (var index = 0; index < MyArray.length; index++) { 
DateArray.push(new Date(MyArray[index] + " 2000")); 
} 
SortedArray = DateArray.sort(); 
MyArray = []; 
for (var index = 0; index < SortedArray.length; index++) { 
    dateBits = SortedArray[0].toDateString().substr(4, 6).split(" "); 
    MyArray[index] = dateBits[1] + " " + dateBits[0]; 
} 
Смежные вопросы