2014-12-19 160 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