2013-08-23 18 views
5

Come trovare il primo di una serie di date. Attualmente ho il seguente codice che funziona bene:Trova la prima di una serie di date 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); 
     } 
}); 

Speravo ci fosse un modo più ordinato (in una riga). Preferirei usare una funzione più semplice in Underscore (min non funziona sulle date)/momentjs.

risposta

12

Ho trovato _.min è affidabile nelle istanze moment. I seguenti lavori:

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

non importa.

+1

Anche Moment ha un metodo min :) http://momentjs.com/docs/#/get-set/min/ –

+0

Ricorda che puoi anche solo passare direttamente la funzione: 'var dates = _.map ([date1, date2], momento); ' ' var start = _.min (date); ' –

3

ecco la soluzione:

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] darebbe il vostro primo appuntamento in formato ordinato. Usando quanto sopra puoi anche ordinare in ordine ascendente e discendente. Ho solo bisogno di modificare in due punti.

Cheers.

+1

:) ... non preoccuparti. lieto di aiutarti .. –

2

È possibile convertire le date per i timestamp tramite getTime() e confrontarli:

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

utilizzarlo come

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

Credo che dovrebbe essere' var timestamp = $ .map (date, function (date) { ' – Stumblor

3

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

vedere mdn Function.apply

Math.min(arg1,arg2,...argN) trova il più basso di N argomenti numerici.

A causa di come Function.prototype.apply opere, Math.min.apply prende due argomenti, un ambiente this, che sembra essere non necessari qui, e un argarray.

La rappresentazione numerica di una data è il ms dal 1970. Una data forzata a un numero produrrà questo valore. Un nuovo oggetto data viene inizializzato su questo valore minimo, che è la stessa data come la data meno recente ma non lo stesso oggetto.

Questo è simile all'approccio di @ fardjad, ma non ha bisogno della libreria underscore.js per _.min., Ed è abbreviato dall'uso di func.apply, che dovrebbe essere javascript comune ai browser più recenti.

2

A oneliner sporco, che non comporta momentjs, potrebbe assomigliare a questo:

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

difficilmente sporco: D –

Problemi correlati