[英]How to sort array of objects where keys are dates
我搜索过这个问题,似乎没有现成的答案。 考虑以下:
[
{ '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] },
...
]
我不知道该怎么办,所以我没有什么可展示的 。
这可以通过在对象键上使用date.parse
来完成。 我拿了第一个对象键,因为它看起来在数组的每个条目中只有1个。 最棘手的部分是date.parse
不会对“12”或“1”的工作,所以,我们不得不暂时取代“日”或“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的东西进行日期解析。
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; }
请注意,将日期字符串表示为对象值而不是对象键可能更安全。 然后,它们将更容易安全地提取(并且访问速度更快)。 例如
{label: 'August 17th 2016', data: [75]},
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.