按照日期对嵌套对象数组进行排序

7

我正在尝试对一个类似这样的数组进行排序:

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() 函数,但我不知道如何根据一个对象内部属性的值来排序数组。有没有一种特定的方法可以排序日期对象?或者它们与数字或字母相同地排序?


您可以在此处找到有关此主题的一些有用答案:**按日期排序Javascript对象数组** - jherax
4个回答

10
根据 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();
});

您能详细解释一下 underscore.js 是什么吗?它是否默认在 js 中实现? - Artur Müller Romanov

5
你可以通过传递自定义排序函数给Array.sort来对它们进行排序。
dateGroups.sort(function(a, b) {
    return b[0].date.getTime() - a[0].date.getTime();
});

自定义函数需要返回小于零的数字(a在b之前),大于零的数字(a在b之后)或零(a和b相等)。

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();
});

当然,这也可以用类似的方式在underscore 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()

0
如果您的日期是以字符串格式存在的,以下方法适用于我:
yourArray.sort((a, b) => Date.parse(b[3]) - Date.parse(a[3]))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接