2013-08-23 34 views
5

Làm cách nào để tìm sớm nhất trong một tập hợp ngày tháng. Hiện tại, tôi có mã sau hoạt động tốt:Tìm sớm nhất của một chuỗi các ngày 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); 
     } 
}); 

Tôi đã hy vọng có một cách gọn gàng (trong một dòng). Tôi muốn sử dụng một chức năng đơn giản hơn trong Underscore (min không hoạt động trên các ngày)/momentjs.

Trả lời

12

Tôi đã tìm thấy _.min đáng tin cậy trên moment trường hợp. Các công trình sau:

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

nevermind.

+1

Moment cũng có một phương pháp min :) http://momentjs.com/docs/#/get-set/min/ –

+0

Hãy nhớ rằng bạn cũng có thể chỉ cần chuyển trực tiếp vào hàm: 'var date = _.map ([date1, date2], moment); ' ' var start = _.min (ngày); ' –

3

Dưới đây là giải pháp:

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] sẽ cung cấp cho bạn hẹn hò đầu tiên của bạn ở định dạng được sắp xếp. Sử dụng ở trên, bạn có thể sắp xếp tăng dần và giảm dần. Chỉ cần thay đổi ở hai nơi.

Chúc mừng.

+1

:) ... không phải lo lắng. vui mừng giúp đỡ của nó cho bạn .. –

2

Bạn có thể chuyển đổi ngày để timestamps qua getTime() và so sánh chúng:

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

Sử dụng nó như

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

Tôi tin rằng nên là' var timestamps = $ .map (ngày, hàm (ngày) { ' – Stumblor

3

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

thấy MDN Function.apply

Math.min(arg1,arg2,...argN) tìm thấy thấp nhất N đối số dạng số.

Do cách Function.prototype.apply công trình, Math.min.apply nhận hai đối số, một khung cảnh this, mà dường như không cần thiết ở đây, và một argarray.

Biểu thị dạng số của một ngày là các mili giây từ năm 1970. Một ngày bị ép buộc thành một số sẽ mang lại giá trị này. Một đối tượng ngày tháng mới được khởi tạo thành giá trị thấp nhất này, giống với ngày giống như ngày sớm nhất nhưng không phải là cùng một đối tượng.

Điều này tương tự như cách tiếp cận của @ fardjad, nhưng không cần thư viện underscore.js cho _.min., Và được rút gọn bằng cách sử dụng func.apply, javascript phổ biến nhất cho các trình duyệt gần đây nhất.

2

Một oneliner bẩn, mà không liên quan đến momentjs, có thể trông như thế này:

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

khó bẩn: D –

Các vấn đề liên quan