2013-08-23 16 views
5

Jak znaleźć najwcześniejszy zestaw dat. Obecnie mam następujący kod, który działa dobrze:Znajdź najwcześniejszy z serii dat JavaScriptu

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); 
     } 
}); 

Miałem nadzieję nastąpił neater sposób (w jednej linii). Wolałbym korzystać z prostszej funkcji w Underscore (min nie działa w datach)/instantjs.

Odpowiedz

12

Znalazłem _.min jest niezawodny na instancjach moment. Następujące prace:

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

nevermind.

+1

Moment ma również metodę min :) http://momentjs.com/docs/#/get-set/min/ –

+0

Pamiętaj, że możesz również po prostu przekazać funkcję bezpośrednio: 'var date = _.map ([date1, date2], moment); ' ' var start = _.min (daty); ' –

3

Oto rozwiązanie:

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] nie daje swoją pierwszą datę w formacie sortowane. Za pomocą powyższego można również sortować rosnąco i malejąco. Wystarczy zmienić w dwóch miejscach.

Pozdrawiam.

+1

:) ... nie ma obaw. Cieszę się, że jest dla ciebie pomocna. –

2

można przekonwertować daty, aby znaczniki czasu poprzez getTime() i porównać je:

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

Używaj go jak

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

Uważam, że powinno to być' var timestamps = $ .map (date, function (date) { ' – Stumblor

3

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

zobaczyć MDN Function.apply

Math.min(arg1,arg2,...argN) znajdzie najniższy od N Argumenty numeryczne.

powodu jak Function.prototype.apply prace, Math.min.apply przyjmuje dwa argumenty, this ustawienie, które wydaje się być niepotrzebne tutaj, a argarray.

Cyfrową reprezentacją daty jest ms od 1970 roku. Data wymuszona na liczbie przyniesie tę wartość. Nowy obiekt daty jest inicjowany do tej najniższej wartości, która jest taka sama jak data najwcześniejsza, ale nie jest tym samym obiektem.

Jest to podobne do podejścia @ fardjad, ale nie potrzebuje biblioteki underscore.js dla _.min., I jest skracane za pomocą func.apply, które powinno być wspólne javascript do najnowszych przeglądarek.

2

Brudny oneliner, który nie wiąże momentjs mógłby wyglądać następująco:

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

mało brudne: D –