我正在尝试对这样的数组进行排序:
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)},
]
]
dateGroups嵌套数组中的对象已经按升序排序,但我还想根据分组的日期对数组进行排序。
在这种情况下,数组应如下所示:
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)},
]
]
用于排序的函数还应返回dateGroups的新排序版本。
我尝试过使用Underscore.js的sortBy()
函数,但我无法弄清楚如何根据其中一个对象内的属性值对数组进行排序。是否有一种特定的方式来排序Date对象?或者它们的排序方式与数字或字母相同?
答案 0 :(得分:9)
根据Underscore.js文档,您应该为该原因编写自己的迭代器。像这样:
_.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();
});
答案 1 :(得分:4)
您可以通过将自定义排序功能传递给Array.sort
来对它们进行排序。
dateGroups.sort(function(a, b) {
return b[0].date.getTime() - a[0].date.getTime();
});
自定义函数需要返回小于零的数字(a在b之前),大于零(a在b之后)或零(a和b相等)。
答案 2 :(得分:1)
据我了解您的问题,您希望对内部组进行排序,以便首先显示早期日期,然后按照第一个日期对组进行排序。 这可以这样做:
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();
});
当然,这可以通过下划线js以类似的方式完成:
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()