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

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

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

1
Jon McIntosh 24 Авг 2010 в 02:28

4 ответа

Лучший ответ

Вам придется анализировать строки в объектах Date () , что было бы достаточно просто, если бы не плохая реализация IE разбора строки даты в 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/

5
Andy E 23 Авг 2010 в 22:57

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

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];
}
-1
Paul Schreiber 23 Авг 2010 в 22:46

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

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
slebetman 23 Авг 2010 в 22:53

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

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;
    }
});
0
Jonas Klemming 23 Авг 2010 в 22:39