我搜索过这个问题,似乎没有现成的答案。请考虑以下事项:
[
{ '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 。
答案 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]},