2015-04-18 2 views
4

У меня есть массив массивов, первое поле которого является датой (в строковом формате). Я хочу сортировать их по дате (по прошествии), поэтому я могу использовать ее для дальнейших вычислений.Сортировка массива массивов по дате в Javascript

Я идентифицирую две задачи по моей проблеме. Сначала проанализируем строки как даты, а затем сортируем.

a = new Date(Date.parse('1/11/2014 13:42:54')); 
console.log(a) 

Вернуться 11th of January а мне нужно 1st of November

Тогда я сортировка должна работать так:

function compare(a,b) { 
    if (a[0] < b[0]) 
    return -1; 
    if (a[0] > b[0]) 
    return 1; 
    return 0; 
} 

myarray.sort(compare); 

Итак, как я могу решить эту проблему с датами, чтобы он работает на функция сортировки?

ответ

1

Просто захватить дату и месяц часть, поменять их местами и сделать Date.parse и new Date, как это

function getFormattedDate(dateString) { 
    var result = dateString.replace(/(\d+)\/(\d+)(.*)/, function (m, g1, g2, g3) { 
     return g2 + "/" + g1 + g3; 
    }); 

    return new Date(Date.parse(result)); 
} 

console.log(getFormattedDate('1/11/2014 13:42:54')); 
// Sat Nov 01 2014 13:42:54 GMT+0000 (GMT) 

Здесь регулярное выражение, (\d+)\/(\d+)(.*) будет захватывать три части строки, сначала (\d+) фиксирует часть даты, за которой следует / (экранированный как \/), а часть месяца с другим (\d+), а остальная часть строки захватывается (.*). Затем мы возвращаем новую строку, заменяя позиции g2 и g1 (месяц и дата).

Примечание: Если все, что вы пытаетесь сделать, это сортировка, то вам не нужно создавать новый объект Date. Вы можете просто использовать результат Date.parse которое время эпохальное, как этот

function getEpochTime(dateString) { 
    var result = dateString.replace(/(\d+)\/(\d+)(.*)/, function (m, g1, g2, g3) { 
     return g2 + "/" + g1 + g3; 
    }); 

    return Date.parse(result); 
} 

function comparator(firstDate, secondDate) { 
    return getEpochTime(firstDate) - getEpochTime(secondDate); 
} 

, а затем сортировать как этот

var arr = ['3/11/2014 13:42:54', 
    '2/11/2014 13:42:54', 
    '1/12/2014 13:42:54', 
    '1/11/2014 13:43:54' 
]; 

arr.sort(comparator); 

console.log(arr); 

даст вам

[ '1/11/2014 13:43:54', 
    '2/11/2014 13:42:54', 
    '3/11/2014 13:42:54', 
    '1/12/2014 13:42:54' ] 
1

Если ваши даты в формате ISO можно использовать такой код:

myarray.sort(function (a, b) { 
    return (new Date(a[0])).getTime() - (new Date(b[0])).getTime(); 
}); 
+0

Будет ли это решить проблему Дат (получить день вместо месяца и наоборот?) – Tasos

+0

getTime() возвращает абсолютные миллисекунды с эпохи и, следовательно, хорош для сортировки в хронологическом порядке. –

+0

@Anastasios Ventouris Nope. Вы должны убедиться, что ваши даты указаны в любом формате [здесь] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/parse) – hindmost

0

Это проблема:

a = new Date(Date.parse('1/11/2014 13:42:54')); 
console.log(a) 

Возвращение 11 января, тогда мне нужно 1го November`

Ваш формат даты dd/mm/yyy; Date.parse('1/11/2014 13:42:54') принимает mm/dd/yyyy

Попробуйте дату синтаксический следующим образом:

function parseDate(str) { 
    var ds = str.match(/(\d+)\/(\d+)\/(\d+)\s+(\d+):(\d+):(\d+)/); 
    // Convert to format: mm/dd/yyyy 
    return new Date(ds[3], ds[2] - 1, // month is 0-based 
       ds[1], ds[4], ds[5], ds[6]); 
} 

var arr = [parseDate('3/11/2014 13:42:54'), 
    parseDate('2/11/2014 13:42:54'), 
    parseDate('1/12/2014 13:42:54'), 
    parseDate('1/11/2014 13:43:54') 
]; 

arr.sort(); 

Или:

function parseDate(str) { 
    var ds = str.match(/(\d+)\/(\d+)\/(\d+)\s+(\d+):(\d+):(\d+)/); 
    // Convert to format: mm/dd/yyyy 
    return new Date(ds[3], ds[2] - 1, // month is 0-based 
       ds[1], ds[4], ds[5], ds[6]); 
} 

var arr = ['3/11/2014 13:42:54', 
    '2/11/2014 13:42:54', 
    '1/12/2014 13:42:54', 
    '1/11/2014 13:43:54' 
]; 


arr.sort(function(a, b) { 
    return parseDate(a) - parseDate(b); 
}) 
1

С момента.JS вы можете создать объект момент, используя String+Format constructor

moment('1/11/2014 13:42:54', 'DD/MM/YYYY HH:mm:ss') 

так, если у вас есть массив массивов, которые первое поле является дата (в формате строки):

array_of_arrays = [ 
    ['1/11/2014 13:42:54', 'val'], 
    ['2/11/2014 13:42:54', true] 
]; 

for(array in array_of_arrays){ 
    epoch = moment(array.shift,'DD/MM/YYYY HH:mm:ss').unix(); 
    array.unshift(epoch); 
} 

теперь вы можете просто сделать new Date(epoch), как вместо сложных объектов даты, мы имеем Unix Epoch, которые могут быть легко отсортирован с inbuid Array.sort что-то вроде этого

function Comparator(a,b){ 
if (a[0] < b[0]) return -1; 
if (a[0] > b[0]) return 1; 
return 0; 
} 
array_of_arrays.sort(Comparator); 

так что теперь вы имеют array_of_arrays, отсортированные по дате

Наконец, если вам нужен более точный ответ, пожалуйста, поделитесь еще одним примером кода.

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