Created
February 8, 2012 20:15
-
-
Save onpubcom/1772996 to your computer and use it in GitHub Desktop.
How to Sort an Array of Dates with JavaScript
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<script type="text/javascript"> | |
// First let's create an array of JavaScript Date | |
// objects. | |
// More info about the Date class: | |
// http://w3schools.com/js/js_obj_date.asp | |
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)]; | |
// Now we will define our date comparison functions. These are callbacks | |
// that we will be providing to the array sort method below. | |
var date_sort_asc = function (date1, date2) { | |
// This is a comparison function that will result in dates being sorted in | |
// ASCENDING order. As you can see, JavaScript's native comparison operators | |
// can be used to compare dates. This was news to me. | |
if (date1 > date2) return 1; | |
if (date1 < date2) return -1; | |
return 0; | |
}; | |
var date_sort_desc = function (date1, date2) { | |
// This is a comparison function that will result in dates being sorted in | |
// DESCENDING order. | |
if (date1 > date2) return -1; | |
if (date1 < date2) return 1; | |
return 0; | |
}; | |
// Finally, we are now able to call the sort method on our array of dates. | |
// More info about array sorting: http://w3schools.com/jsref/jsref_sort.asp | |
// First let's sort the array in ascending order. | |
dates.sort(date_sort_asc); | |
// Now let's output the results to the page to show that the dates are now | |
// sorted in ascending order. | |
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>'); | |
} | |
// Now let's sort the dates in descending order and output the results. | |
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>'); | |
} | |
// That's all there is to it! | |
// From: http://onpub.com/index.php?s=7&a=109 | |
</script> |
probably late but also a simple subtraction of data prototypes to sort function would work just fine , reduce unnecessary return -1
like :
var date_sort_asc = function (date1, date2) {
// Accending order.
return date2 - date1
};
even better es6 one-liner:
dataArray.sort((a,b)=> b-a)
Thanks!
@obonyojimmy that is not working in my environment. Node.js version 9.
Won't work because it returns NaN , compare and return yourself @lancedolan
I think @obonyojimmy 's functions actually sort in descending order. Switch to dateArray.sort((a,b)=> a-b)
for ascending.
For anyone who comes across this looking from a TS compliant approach.
dataArray.sort((a,b)=> Number(a)-Number(b))
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
@saich
Array.prototype.sort()
will not work as you're hoping. The MDN docs state that if you omit a custom sort function:This means that each date will be toString-ed to a date string such as
Sun Aug 21 2016 00:00:00 GMT-0600 (MDT)
first, then each character, starting from the left, will have it's Unicode point value compared one at a time. This results in unexpected behavior in the sort, since it will essentially sort the array by days of the week first instead of absolute time of each date.The
<
and>
operators call theObject.prototype.valueOf()
function for each operand, then compare the values. This means that a<
or>
comparison between two dates calls theDate.prototype.valueOf()
function for each date object before comparing the values, giving an accurate, absolute comparison.