2013-07-02 32 views
2

我有一個字符串,它看起來像一個數組:如何爲javascript排序函數創建一個有效的比較器來排序字符串數組?

array = ['third', 'first', 'fourth', 'second', 'custom2', 'custom1'] 

,我想排序這個數組,所以它看起來像:

array = ['first', 'second', 'third', 'fourth', 'custom2', 'custom1'] 

特定字符串的「第一」,'第二個',...應按給定順序排序(第一個在第三個之前第二個...之前),並且任何其他字符串應按照任意順序結尾。僅包含子集的那些字符串數組應該在正確的順序無論如何進行排序:

['fourth', 'something', 'second'] => ['second', 'fourth', 'something'] 

我不知道是否有寫FOT這將解決這個問題的JavaScript sort()函數的比較器功能的可能性有效。

+0

您可以用現場演示發佈您的代碼,到目前爲止,並解釋沒有工作? – elclanrs

+0

嗯...我還沒有真正的工作代碼,我有這個用作鍵的字符串數組,我想對它們進行排序。所以我搜索了一個可能性,併爲javascript sort()函數找到了比較函數參數。我堅持這一點。 – karlitos

回答

3

這樣的事情?

array = ['third', 'first', 'fourth', 'second', 'custom2', 'custom1'] 
special = ['first', 'second', 'third', 'fourth'] 

array.sort(function(a, b) { 
    var ia = special.indexOf(a) 
    var ib = special.indexOf(b) 

    if(ia >= 0 && ib >= 0) return ia - ib; 

    if(ia >= 0) return -1; 
    if(ib >= 0) return +1; 

    return a > b ? 1 : a == b ? 0 : -1; 
}) 

console.log(array) 
[ 
"first", 
"second", 
"third", 
"fourth", 
"custom1", 
"custom2" 
] 

,或者更好,使用schwartzian transform

a = array.map(function(x) { 
    var n = special.indexOf(x); 
    return [n < 0 ? array.length : n, x] 
}).sort(function(a, b) { 
    return (a[0] - b[0]) || (a[1] > b[1] ? 1 : a[1] == b[1] ? 0 : -1); 
}).map(function(x) { 
    return x[1] 
}) 
+0

非常感謝,這個特殊的陣列是一個好主意,非常好的代碼,謝謝! – karlitos

+0

如果我能爲_schwartzian transform_提供另一個** + 1 **,只是因爲你把它帶回到我的腦海中,我可以在今天晚些時候完美地使用它:D –

+0

是否可以改變你的例子,該數組包含一些ID,應該按關聯值排序? Like array = ['ID3','ID1','ID4','ID2','IDxz','IDxy'] pairs = {'ID3':'third','ID1':'first','ID4 ':'fourth','ID2':'second','IDxz':'custom2','IDxy':'custom1'}? 我能夠通過用對[a]/pairs [b]替換a/b來改變比較器的功能,但是這對於schwartzian變換不起作用。 – karlitos