2014-12-19 158 views
1

我有一個包含數字和字符串數組:我需要用數字來把它們按升序排列排序的字母數字陣列

disorderedArray = ["74783 Banana", "38903 Orange", "94859 Apple"]; 

。我發現一個例子,降序運行良好Sort Alphanumeric String Descending 但是,我似乎無法更改返回行使數組升序。我試圖把arr.reverse();在返回線之後,但是這看起來有些ha and,而且不管用。我也改變了迴歸線中的>和<符號,但我開始得到瘋狂的結果。

function sort() { 
    var arr=disorderedArray; 
    arr.sort(function(a,b){ 
    a=a.split(" "); 
    b=b.split(" "); 
    var an=parseInt(a[0],10); 
    var bn=parseInt(b[0],10); 
    return an<bn?1:(an>bn?-1:(a[1]<b[1]?-1:(a[1]>b[1]?1:0))); 

    arr.reverse(); 

    }); 
    console.log(arr); 
} 
+1

'arr.reverse()'不會因爲你在之前使用'return'而被擊中。 – 2014-12-19 10:44:44

+0

可能的重複(http://stackoverflow.com/a/2802489/2749470)使用fu鏈接(http://www.davekoelle.com/files/alphanum.js) – 2014-12-19 10:47:15

+0

@aduch:默認排序將值作爲文本進行比較,所以例如'9 abc'會出現在177723773 abc後面。 – Guffa 2014-12-19 10:52:25

回答

3

回調函數根據值的比較返回正值或負值。只要改變返回的-11值的符號:

return an<bn?-1:(an>bn?1:(a[1]<b[1]?1:(a[1]>b[1]?-1:0))); 

這裏是寫同一個更可讀的方式:

return (
    an < bn ? -1 : 
    an > bn ? 1 : 
    a[1] < b[1] ? 1 : 
    a[1] > b[1] ? -1 : 
    0 
); 

而且,原代碼排序數字部分下降和其他的字符串上升,所以這是相反的。前兩個比較的值決定了數字部分的排序方式,最後兩個決定了其餘字符串的排序方式,因此您可以調整它們以獲得所需的組合。

+0

這很好。謝謝。我知道這與倒退回歸線中的一個符號有關,但我非常懷疑我會通過反覆試驗來了解這一點。 – user3080392 2014-12-19 10:57:17

+0

我將如何改變單詞從a到z而不是z到a的順序。例如,使用您輸入的代碼可以將字母數字數組設置爲:[「111 zucchini」,「111 orange」,「111 apple」]。我應該怎麼做:[「111蘋果」,「111橙」,「111西葫蘆」] – user3080392 2014-12-21 15:10:03

+0

@ user3080392:在最後的comarisons中交換'1'和'-1';比較「a [1]」和「b [1]」。 – Guffa 2014-12-21 16:10:55

2

排序的功能就是排序。你需要在已排序的數組上調用reverse。

function sort() { 
    var arr = disorderedArray; 
    arr.sort(function(a, b) { 
     a = a.split(" "); 
     b = b.split(" "); 
     var an = parseInt(a[0], 10); 
     var bn = parseInt(b[0], 10); 
     return an < bn ? 1 : (an > bn ? -1 : (a[1] < b[1] ? -1 : (a[1] > b[1] ? 1 : 0))); 
    }); 
    console.log(arr.reverse()); 
} 
+0

這也工作。謝謝。 – user3080392 2014-12-19 10:57:58