如何对键是日期的对象数组进行排序

时间:2016-12-11 19:15:34

标签: javascript arrays sorting date-parsing

我搜索过这个问题,似乎没有现成的答案。请考虑以下事项:

[
  { 'August 17th 2016': [75] }, // 75 is the length of the array which contains up to 75 objects ... 
  { 'August 1st 2016': [5] },
  { 'August 28th 2016': [5] },
  ...
]

按照日期排序此数组中对象的最佳方法是什么,仍保留其键的“英语”表示?

注意:该键用作图表标签。

我看到的所有地方array.sort都被使用了,但这是关于对象的关键词created_at

结果应为:

[
  { 'August 1st 2016': [5] },
  { 'August 17th 2016': [75] }
  { 'August 28th 2016': [5] },
  ...
]

我不知道如何继续,所以我没有任何东西 show

2 个答案:

答案 0 :(得分:6)

这可以通过在对象键上使用date.parse来完成。我拿了第一个对象键,因为它看起来在数组的每个条目中只有1个。棘手的部分是date.parse不适用于" 12th"或者" 1st",所以,我们必须暂时更换" th"或" st"使用,。这样,date.parse就可以处理字符串。



var dates = [{
  'August 17th 2016': [75]
}, {
  'August 1st 2016': [5]
}, {
  'August 28th 2016': [5]
}]

const replaceOrdinals = o => {
  return Object.keys(o)[0].replace(/\w{2}( \d+$)/, ',$1');
}

dates = dates.sort((a, b) => {
  return Date.parse(replaceOrdinals(a)) - Date.parse(replaceOrdinals(b))
});

console.log(dates);




请记住:

来自评论中的@adeneo:Date.parse是依赖于实现的。您可能希望仔细阅读它的文档,以确定时区之类的东西是否会搞砸。作为一种更可靠的方法,您可以使用类似moment.js的东西进行日期解析。

答案 1 :(得分:0)

answer by Kevbot中的解决方案很优雅,但其应用程序仅限于ES6浏览器,其实现date.parse()符合OP使用的特定日期格式。

不是为了避免date.parse()依赖项而添加moment.js之类的库,而是可以在任何JavaScript环境(包括旧浏览器)中使用的定制解决方案,只需几行代码:



var dates = [
  {'August 17th 2016': [75]}, 
  {'August 1st 2016': [5]}, 
  {'August 28th 2016': [5]}
];

dates.sort(function(a, b){
  var i, j;
  for(i in a); //get datestring a
  for(j in b); //get datestring b;
  return MMMDDYYYYtoSortableNumber(i) -
    MMMDDYYYYtoSortableNumber(j);
});

console.log(dates);

// MMMDDYYYYtoSortableNumber() converts datestrings
// such as "April 5th 1969" to 19690405.
// Month name to digit approach adapted from 
// https://gist.github.com/atk/1053863
  
function MMMDDYYYYtoSortableNumber(datestring) {
  var mdy = datestring.match(/\w(\w\w)\D+(\d+)\D+(\d+)/);
  return mdy[3] * 10000 +
    '  anebarprayunulugepctovec'.search(mdy[1]) * 50 +
    mdy[2] * 1;
}




请注意,将日期字符串表示为对象值而不是对象键可能更安全。然后,它们将更容易安全地提取(并且访问速度更快)。 E.g。

{label: 'August 17th 2016', data: [75]},