如何按日期(ISO 8601)对此数组排序?
var myArray = new Array();
myArray[0] = { name:'oldest', date:'2007-01-17T08:00:00Z' }
myArray[1] = { name:'newest', date:'2011-01-28T08:00:00Z' }
myArray[2] = { name:'old', date:'2009-11-25T08:00:00Z' }
Playground:
如何按日期(ISO 8601)对此数组排序?
var myArray = new Array();
myArray[0] = { name:'oldest', date:'2007-01-17T08:00:00Z' }
myArray[1] = { name:'newest', date:'2011-01-28T08:00:00Z' }
myArray[2] = { name:'old', date:'2009-11-25T08:00:00Z' }
Playground:
8条答案
按热度按时间mec1mxoz1#
按字典排序:
正如@kdbanman指出的,ISO8601 See *General principle * 是为字典排序设计的,因此ISO 8601字符串表示可以像其他字符串一样排序,这将给予预期的顺序。
因此,您将实施:
使用JavaScript排序日期:
这是一篇非常好的文章,介绍了如何创建一个与Javascript ISO 8601兼容的日期,然后您可以像常规javascript日期一样对其进行排序。
http://webcloud.se/log/JavaScript-and-ISO-8601/
用法:
更新了用法,以包括分类技术credit @nbrooks
yrdbyhpb2#
通过使用内置的字典顺序比较函数String.prototype.localeCompare,而不是
?:
复合运算符或其它表达式,可以避免创建日期和:41ik7eoe3#
小心,现在公认的答案建议我们按字典顺序排列日期。
但是,只有当所有字符串都使用'Z'或'+00'时区(= UTC)时,此操作才有效。以'Z'结尾的日期字符串确实符合ISO8601标准,但并非所有ISO8601都以'Z'结尾。
因此,为了完全符合ISO8601,你需要用一些Date库(例如Javascript Date或Moment.js)解析你的字符串,并比较这些对象。对于这一部分,你可以检查Scott的答案,它也涵盖了与ISO8601不兼容的浏览器。
我的简单例子是Javascript Date(适用于任何不太老的浏览器):
缺点:这比按字典顺序比较字符串要慢。
关于ISO8601标准的更多信息:给你。
zdwk9cvp4#
我会这么说:
new9mtju5#
http://jsfiddle.net/4tUZt/2/
e37o9pze6#
演示:http://jsfiddle.net/4tUZt/4/
cclgggtu7#
ISO8601被设计为以纯文本的形式正确排序,所以一般来说,普通排序就可以了。
要按数组中对象的特定键排序,需要为
sort()
方法指定一个比较函数,在许多其他语言中,使用cmp
函数很容易编写这些函数,但JS没有内置cmp
函数,所以我发现自己编写更容易。另外,我会使用类似JSON的语法编写数组,如下所示:
crcmnpdw8#
在排序可能缺少日期的对象的示例中,并且日期可能位于不同的时区,您最终将需要一些更复杂的东西:
如果您知道所有日期都已定义并且有效,并且所有日期都在同一时区,那么您应该选择其他更快的答案之一。但是,如果您希望日期排序,有一个或多个这样的边缘情况,并且不希望必须预处理数据来清理它,那么我建议使用此方法。
我试图在下面的片段中演示其他答案在这些边缘情况下是如何失败的。