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

Posted

技术标签:

【中文标题】按日期对对象的嵌套数组进行排序【英文标题】:Sorting nested arrays of objects by date 【发布时间】:2012-03-06 18:56:27 【问题描述】:

我正在尝试对如下所示的数组进行排序:

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 对象进行排序?还是它们的排序方式与数字或字母相同?

【问题讨论】:

您可以在此处找到有关此主题的一些有用答案:Sort javascript Object Array By Date 【参考方案1】:

如果您有字符串格式的日期,这对我有用:

yourArray.sort((a, b) => Date.parse(b[3]) - Date.parse(a[3]))

【讨论】:

【参考方案2】:

据我了解您的问题,您希望对内部组进行排序,以便首先显示早期日期,然后按组的第一个日期对组进行排序。 可以这样做:

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

【讨论】:

【参考方案3】:

根据 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中实现?【参考方案4】:

您可以通过将自定义排序函数传递给Array.sort 来对它们进行排序。

dateGroups.sort(function(a, b) 
    return b[0].date.getTime() - a[0].date.getTime();
);

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

【讨论】:

以上是关于按日期对对象的嵌套数组进行排序的主要内容,如果未能解决你的问题,请参考以下文章

Javascript - 按日期然后按时间对对象数组进行排序

javascript 使用日期值按单键对对象数组进行排序

JQuery使用日期对对象数组进行排序[重复]

按日期排序对象数组[重复]

按日期排序数组 - javascript [重复]

按即将到来的日期对日期为字符串的数组进行排序