时区偏移数组的自定义排序

Posted

技术标签:

【中文标题】时区偏移数组的自定义排序【英文标题】:custom sort for an array of timezone offsets 【发布时间】:2016-08-03 02:30:51 【问题描述】:

我正在尝试对一组时区偏移量进行排序,如下所示:

["+03:00", "-11:00", "+05:00", "-04:00"]

这只是数组的一个子集。包括基于 GMT 的时区的所有偏移量。逻辑顺序是从-11.00开始的GMT距离

所以最终正确的排序是:

["-11:00", "-04:00", "+03:00", "+05:00"]

我必须在这里使用Array.prototype.sort,但我不完全确定在这里使用的最有效的自定义排序函数是什么。它会涉及将字符串分成两部分吗?例如:-|+offset,例如:11, 4, 3, 5,然后比较它们?有没有办法减少处理?

【问题讨论】:

您是否曾经需要处理“半小时区”? IE。达尔文/澳大利亚是+9:30 还是它们总是整数? 数组中的条目必须是字符串吗?它们可以是数字吗? 【参考方案1】:

排序函数应该是

function(a, b)  
    return parseFloat(a.replace(':', '.')) - parseFloat(b.replace(':', '.'));

基本上,将: 更改为. 并返回解析后的浮点数的差异

您还可以执行以下操作:

function(a, b)  
    return parseInt(a.replace(':', ''), 10) - parseInt(b.replace(':', ''), 10);
;

这会将字符串转换为+/-HHMM,然后您可以将其解析为整数,并且仍然能够支持大量非整小时时区。虽然我不认为有那么多的表现要获得

【讨论】:

【参考方案2】:

假设时区总是以:00 结尾,您可以简单地parseInt 它们:

["+03:00", "-11:00", "+05:00", "-04:00"].sort(
    ( a, b ) => (a, 10) > parseInt(b, 10)
);

parseInt 将向上读取一个字符串,直到找到看起来不像数字的字符。例如parseInt('1a') 返回1。由于'-11:00' 的第一部分是一个有效数字('-11'),parseInt 会正确读取它。

【讨论】:

非整点时区会失败

以上是关于时区偏移数组的自定义排序的主要内容,如果未能解决你的问题,请参考以下文章

Spark UDF 到自定义排序结构数组

【JS】数组对象自定义排序

按自定义数组对行进行排序

使用自定义谓词对 numpy 数组进行排序

使用内部对象的实例变量的值对自定义对象数组进行排序

QTableView的自定义排序方法?