I'm trying to sort an array that looks like this:
var dateGroups = [
[
{age:20, date: Fri Feb 03 2012 14:30:00 GMT+1100 (EST)},
{age:12, date: Fri Feb 03 2012 18:20:00 GMT+1100 (EST)},
{age:18, date: Fri Feb 03 2012 21:43:00 GMT+1100 (EST)}
],
[
{age:32, date: Fri Feb 01 2012 10:54:00 GMT+1100 (EST)},
{age:44, date: Fri Feb 01 2012 11:45:00 GMT+1100 (EST)},
],
[
{age:22, date: Fri Feb 05 2012 10:54:00 GMT+1100 (EST)},
{age:22, date: Fri Feb 05 2012 18:22:00 GMT+1100 (EST)},
]
]
The objects inside dateGroups' nested arrays are already sorted in ascending order, but I also want to sort the arrays themselves based on the grouped dates.
In this case the array should then look like this:
var dateGroups = [
[
{age:32, date: Fri Feb 01 2012 10:54:00 GMT+1100 (EST)},
{age:44, date: Fri Feb 01 2012 11:45:00 GMT+1100 (EST)},
],
[
{age:20, date: Fri Feb 03 2012 14:30:00 GMT+1100 (EST)},
{age:12, date: Fri Feb 03 2012 18:20:00 GMT+1100 (EST)},
{age:18, date: Fri Feb 03 2012 21:43:00 GMT+1100 (EST)}
],
[
{age:22, date: Fri Feb 05 2012 10:54:00 GMT+1100 (EST)},
{age:22, date: Fri Feb 05 2012 18:22:00 GMT+1100 (EST)},
]
]
The function used to sort should also return the new sorted version of dateGroups.
I've tried using Underscore.js's sortBy()
function but I can't figure out how to sort the arrays based on the value of a property inside one of the objects. Is there a specific way to sort Date objects? Or are they sorted in the same way as numbers or letters?
I'm trying to sort an array that looks like this:
var dateGroups = [
[
{age:20, date: Fri Feb 03 2012 14:30:00 GMT+1100 (EST)},
{age:12, date: Fri Feb 03 2012 18:20:00 GMT+1100 (EST)},
{age:18, date: Fri Feb 03 2012 21:43:00 GMT+1100 (EST)}
],
[
{age:32, date: Fri Feb 01 2012 10:54:00 GMT+1100 (EST)},
{age:44, date: Fri Feb 01 2012 11:45:00 GMT+1100 (EST)},
],
[
{age:22, date: Fri Feb 05 2012 10:54:00 GMT+1100 (EST)},
{age:22, date: Fri Feb 05 2012 18:22:00 GMT+1100 (EST)},
]
]
The objects inside dateGroups' nested arrays are already sorted in ascending order, but I also want to sort the arrays themselves based on the grouped dates.
In this case the array should then look like this:
var dateGroups = [
[
{age:32, date: Fri Feb 01 2012 10:54:00 GMT+1100 (EST)},
{age:44, date: Fri Feb 01 2012 11:45:00 GMT+1100 (EST)},
],
[
{age:20, date: Fri Feb 03 2012 14:30:00 GMT+1100 (EST)},
{age:12, date: Fri Feb 03 2012 18:20:00 GMT+1100 (EST)},
{age:18, date: Fri Feb 03 2012 21:43:00 GMT+1100 (EST)}
],
[
{age:22, date: Fri Feb 05 2012 10:54:00 GMT+1100 (EST)},
{age:22, date: Fri Feb 05 2012 18:22:00 GMT+1100 (EST)},
]
]
The function used to sort should also return the new sorted version of dateGroups.
I've tried using Underscore.js's sortBy()
function but I can't figure out how to sort the arrays based on the value of a property inside one of the objects. Is there a specific way to sort Date objects? Or are they sorted in the same way as numbers or letters?
- You can find some useful answers to this topic here: Sort Javascript Object Array By Date – jherax Commented Nov 5, 2014 at 15:33
4 Answers
Reset to default 10According to Underscore.js documentation, you should simply write your own iterator for that cause. Something like this:
_.sortBy(dateGroups, function(arrayElement) {
//element will be each array, so we just return a date from first element in it
return arrayElement[0].date.getTime();
});
You can sort them by passing a custom sort function to Array.sort
.
dateGroups.sort(function(a, b) {
return b[0].date.getTime() - a[0].date.getTime();
});
The custom function needs to return a number less than zero (a comes before b), greater than zero (a comes after b) or zero (a and b are equal).
As far as I understand your question, you want to sort the inner groups so that the early dates will be displayed first and then sort the groups by their first dates. This could be done like this:
var sortedDateGroups = dateGroups.map(function(dateGroup) {
// sort the inner groups
dateGroup.sort(function(a,b) {
return a.date.getTime() - b.date.getTime();
});
return dateGroup;
}).sort(function(a,b) {
// sort the outer groups
return a[0].date.getTime() - b[0].date.getTime();
});
Of course this could be done with underscore js in a similar fashion:
var sortedDateGroups = _.chain(dateGroups).map(function(dateGroup) {
return _.sortBy(dateGroup, function(inner) {
return inner.date.getTime();
});
}).sortBy(function(outer) {
return outer[0].date.getTime();
}).value()
In case you have dates in string format, this worked for me:
yourArray.sort((a, b) => Date.parse(b[3]) - Date.parse(a[3]))