2016-08-03 50 views
0

我試圖排序時區偏移的數組,如下所示:時區的偏移量的數組自定義排序

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

這僅僅是一個數組的一個子集。包括所有基於GMT的時差的偏移量。邏輯順序是從格林尼治標準時間距離開始-11.00

所以最終的正確順序應該是:

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

我不得不在這裏使用Array.prototype.sort,但我不完全知道什麼是這裏使用的最有效的自定義排序功能就是。它會涉及到把弦分成兩部分?例如:-|+offset,例如:11, 4, 3, 5,然後比較那些?有沒有辦法用較少的處理做到這一點?

+0

你有沒有必要處理'半小時區'?即。達爾文/澳大利亞是'+9:30'還是總是整數? – haxxxton

+0

數組中的條目是否必須是字符串?他們可以用數字來代替嗎? – SpiderPig

回答

2

排序功能應該是

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

基本上改變:.,並在結果分析花車返回區別

你也可以做到以下幾點:

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

這會將字符串轉換爲+/-HHMM,然後您可以將其解析爲一個整數,並且仍然能夠支持no非整小時時區的實質數量。雖然我不認爲有這麼多的性能可以得到的

0

假設該時區始終: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將正確讀取它。

+0

這將失敗,非整個小時的時區 –