使用java脚本对字母数字数组进行排序

时间:2014-04-04 09:13:38

标签: javascript arrays natsort

我有一个字母数字数组 -

var a1 =["3800tl-24G-2XG-PoEP", "3500", "stack-TA", "2620-48-PoEP", "2120", "3800tl-24G-2XG-PoEP"];

我尝试使用natsort对这个数组进行排序,这给了我正确的输出 -

`Array ( [4] => 2120 [3] => 2620-48-PoEP [1] => 3500 [0] => 3800tl-24G-2XG-PoEP [5] => 3800tl-24G-2XG-PoEP [2] => stack-TA )`

我尝试用javascript -

做同样的事情
var a1 =["3800tl-24G-2XG-PoEP", "3500", "stack-TA", "2620-48-PoEP", "2120", "3800tl-24G-2XG-PoEP"];

    var a2 = a1.sort(function(a,b){
        var charPart = [a.substring(0,1), b.substring(0,1)],
            numPart = [a.substring(1)*1, b.substring(1)*1];

        if(charPart[0] < charPart[1]) return -1;
        else if(charPart[0] > charPart[1]) return 1;
        else{ //(charPart[0] == charPart[1]){
            if(numPart[0] < numPart[1]) return -1;
            else if(numPart[0] > numPart[1]) return 1;
            return 0;
        }
    });
    $('#r').html(a2.toString())

给了我输出 - 2620-48-PoEP,2120,3800tl-24G-2XG-PoEP,3500,3800tl-24G-2XG-PoEP,stack-TA

为什么javascript代码没有将2120作为第一个元素。 javascript代码有什么问题?

1 个答案:

答案 0 :(得分:1)

替换此行...

[a.substring(1)*1, b.substring(1)*1]

...与......

[parseInt(a.substring(1), 10), parseInt(b.substring(1), 10)]

...它会起作用(demo),尽管排序功能仍然不会尽可能通用。

说明:a.substr(1)*1(更好地写为+a.substr(1),btw)将子字符串强制转换为Number类型。从理论上讲,这应该给你一个真实的数字。但是,在JS实践中,如果字符串的其余部分不是数字的完整表示,除了该数字之外什么都没有,它将失败(给NaN)。

例如,对于2620-48-PoEP行,'620-48-PoEP'会转换为Number。现在JS无法将其解释为620 - 它对于它来说太大胆了,因为那里还有一些其他有意义的(=非空白)字符。因此,它不会向您620提供NaN

现在,NaNNaN之间的任何比较都是假的(期望!=) - 这实际上会使您的排序功能变得混乱。


作为旁注,array.sort就地更新对象 - 您不需要使用其他引用(a2变量),您可以使用a1。< / p>