Javascript - 将字母数字组合按顺序排序

4
我有一串字母和数字的组合。例如:2E12、1Z10、3D13、3D03、FB14、X002等。
我已经尝试了很多方法来排序这些字符串,但似乎都没有成功。parseInt函数可以按照顺序对字符串进行分组,但整个数组从未被排序过(它是一个json数组),如果多次运行排序,则会出现不同的结果。
我也尝试使用正则表达式将所有字母替换为数字,但这会导致逻辑错误。每次将字符串中间的大写字母替换为数字时,数字会增加10或20倍。例如,1Z10会创建12610,即使它以1开头,应该排在前面。
有谁知道如何排序这些字符串吗?无论字母还是数字排在前面都没关系,只要能够避免随机出现即可。
谢谢!

2
你能给出一个你想要排序的示例吗?一个简单的字符串排序应该可以做到你所要求的,例如:http://www.javascriptkit.com/javatutors/arraysort.shtml - Anthony -GISCOE-
1个回答

11

如果你希望数字序列按照数字大小排序,而不是按照字符顺序排序,例如让100排在2之后,你需要使用所谓的自然排序方法-

这只是一个例子,Google 上有更多相关内容。

// case insensitive, digits to number interpolation

function natSort(as, bs){
    var a, b, a1, b1, i= 0, L, rx=  /(\d+)|(\D+)/g, rd=  /\d/;
    if(isFinite(as) && isFinite(bs)) return as - bs;
    a= String(as).toLowerCase();
    b= String(bs).toLowerCase();
    if(a=== b) return 0;
    if(!(rd.test(a) && rd.test(b))) return a> b? 1: -1;
    a= a.match(rx);
    b= b.match(rx);
    L= a.length> b.length? b.length: a.length;
    while(i < L){
        a1= a[i];
        b1= b[i++];
        if(a1!== b1){
            if(isFinite(a1) && isFinite(b1)){
                if(a1.charAt(0)=== "0") a1= "." + a1;
                if(b1.charAt(0)=== "0") b1= "." + b1;
                return a1 - b1;
            }
            else return a1> b1? 1: -1;
        }
    }
    return a.length - b.length;
}

var s = '2E12, 1Z10, 1z2, 3D13, 3D03, FB14, X002'.split(', ');

s.sort(natSort)

/*  returned value: (Array)
1z2,1Z10,2E12,3D03,3D13,FB14,X002
*/

很棒又有点疯狂,我猜sort()自然排序模式先处理数字,其次是带字母的数字,虽然有点让人烦恼,但这似乎是有道理的。 - ericjam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接