2013-08-23 2 views
5

Как найти самый ранний набор дат. В настоящее время у меня есть следующий код, который работает просто отлично:Найти ближайшую из дат JavaScript

var dates = [date1,date2]; // list of javascript dates 
var start = moment(new Date(9999, 0, 1)) 
// I wished this was one line in momentjs + underscorejs 
_.forEach(dates, (date) => { 
     if (moment(date).isBefore(start)) { 
      start = moment(date); 
     } 
}); 

Я надеялся, что там был аккуратнее путь (в одной строке). Я бы предпочел использовать более простую функцию в Underscore (min не работает в датах)/momentjs.

ответ

12

Я нашел _.min надёжно на moment экземплярах. Следующие работы:

var dates = _.map([date1,date2],function(date){return moment(date)}); 
    var start = _.min(dates);  

nevermind.

+1

У Moment также есть метод min :) http://momentjs.com/docs/#/get-set/min/ –

+0

Помните, что вы можете просто просто передать функцию напрямую: 'var date = _.map ([date1, date2], moment); ' ' var start = _.min (date); ' –

3

Вот решение:

var dates = [ 
    new Date(2010, 4, 10, 10, 07, 16), 
    new Date(2010, 4, 8, 9, 16, 09), 
    new Date(2010, 3, 30, 0, 15, 49), 
    new Date(2010, 3, 8, 10, 08, 35) 
]; 


var date_sort_asc = function (date1, date2) { 

if (date1 > date2) return 1; 
if (date1 < date2) return -1; 
return 0; 
}; 

var date_sort_desc = function (date1, date2) { 

if (date1 > date2) return -1; 
if (date1 < date2) return 1; 
return 0; 
};  

dates.sort(date_sort_asc); 

document.write('<p>Dates sorted in ascending order (oldest to newest):</p>'); 
for (var i = 0; i < dates.length; i++) { 
document.write(i + ': ' + dates[i] + '<br>'); 
}  

dates.sort(date_sort_desc); 

document.write('<p>Dates sorted in descending order (newest to oldest):</p>'); 
for (var i = 0; i < dates.length; i++) { 
document.write(i + ': ' + dates[i] + '<br>'); 

} 

dates[0] даст вам свой первый срок в отсортированном виде. Используя вышеизложенное, вы можете сортировать по возрастанию и по убыванию. Просто нужно изменить в двух местах.

Cheers.

+1

:) ... не беспокойтесь. рад помочь вам .. –

2

Вы можете преобразовать даты, чтобы временные метки с помощью getTime() и сравнить их:

// WARNING: Untested code ahead 
function getMinDate(dates) { 
    var timestamps = dates.map(function (date) { 
     return date.getTime() 
    }); 
    return new Date(_.min(timestamps)); 
} 

Используйте его как

getMinDate(yourDatesArray); // returns min date 
+0

Я считаю, что это должно быть' var timestamps = $ .map (date, function (date) { ' – Stumblor

3

var earliest = new Date(Math.min.apply(null, dates))

см MDN Function.apply

Math.min(arg1,arg2,...argN) находит самый низкий из N числовые аргументы.

Из-за того, как Function.prototype.apply работы, Math.min.apply принимает два аргумента, this параметр а, по-видимому, ненужной здесь и argarray.

Числовое представление даты - это мс с 1970 года. Дата, принужденная к числу, даст это значение. Новый объект даты инициализируется до этого самого низкого значения, которое является тем же самым , что и самая ранняя дата, но не тот же объект.

Это похоже на подход @ fardjad, но не нуждается в библиотеке underscore.js для _.min. И сокращается с помощью func.apply, который должен быть распространенным javascript для самых последних браузеров.

2

Грязный Oneliner, который не включает в себя momentjs, может выглядеть следующим образом:

var minDate = new Date(_.min(dates.map(function (date) { return date.getTime(); }))); 
+0

плохо грязный: D –