2014-06-30 75 views
0

我試圖數組排序,看起來像這樣:排序 - 移動數字和特殊字符到最後

var arr = ["a", "c", "1", "e", "-", "4", "p", "$", "~", "6", "33", "h"]; 

我想應該是順序:

var arr = ["a", "c", "e", "h", "p", "-", "~", "$", "1", "33", "4", "6"]; 

我已經有一個工作解決方案,但我不確定這是如何做到最好(最快)的方式。

arr.sort(function(a, b) { 
    return a.localeCompare(b); 
}); 

for (var i = 0; i < arrLength; i++) { 
    if (arr[i].localeCompare("a") >= 0) { 
     if (i > 0) { 
      Array.prototype.push.apply(arr, arr.splice(0, i)); 
     } 

     break; 
    } 
} 
+0

我認爲這個問題最適合代碼審查http://codereview.stackexchange.com/ – laaposto

+0

嘗試jsperf.com基準 – DhruvPathak

+1

你只需要一個'sort'回調函數返回'-1','0'或' 1'取決於'a'是否應該在'b'之前,等於或之後排序。你只需要更新你的比較邏輯來考慮你的具體規則... – deceze

回答

2

是的,你應該在比較函數中包含邏輯。這比首先按一個標準排序然後通過其他標準移動數組部分更容易理解,並且在其他情況下它可以重用。

你想

arr.sort(function(a, b) { 
    var aIsAlphabetical = a.localeCompare("a") >= 0, 
     bIsAlphabetical = b.localeCompare("a") >= 0; 
    if (!aIsAlphabetical && bIsAlphabetical) 
     return 1; 
    if (aIsAlphabetical && !bIsAlphabetical) 
     return -1; 
    return a.localeCompare(b); 
}); 

,或者縮短:

arr.sort(function(a, b) { 
    return (b.localeCompare("a")>=0)-(a.localeCompare("a")>=0) || a.localeCompare(b); 
}); 

如果您正在尋找最快的代碼,你應該建立在針對性的系統基準具有很好的例子陣列。

+0

要添加,請記住數組是按原樣排序的,因此請確保在運行基準時始終克隆數組。 –

+0

看起來不錯,但是我在一個特定的平臺上做了一個基準測試,並且用1335個條目對一個數組進行排序大約需要1336.75ms(是的,我知道速度很慢),但是我的版本高於它需要〜502.75ms這是一個巨大差距。 – 0101