Javascript - Сортировка буквенных чисел - PullRequest
4 голосов
/ 16 мая 2011

У меня есть комбинация букв и цифр. Например: 2E12, 1Z10, 3D13, 3D03, FB14, X002 и т. Д.

Я пробовал несколько методов для сортировки этих строк, но, похоже, ничего не работает. parseInt работает в скоплениях, но весь массив никогда не сортируется (это массив json), и при повторной сортировке появляются другие результаты.

Я также пытался использовать регулярные выражения для замены всех букв на цифры, но это создает логическую ошибку. Каждый раз, когда большая буква в середине строки заменяется, она увеличивает число в 10 или 20. Например, 1Z10 создаст 12610, даже если он начинается с 1 и должен сортироваться по направлению вверх.

Кто-нибудь знает, как сортировать эти строки? Неважно, будет ли буква первой или цифра первой, пока я могу избежать случайных встреч.

Заранее спасибо!

1 Ответ

11 голосов
/ 16 мая 2011

, если вы хотите, чтобы последовательности цифр сортировались, как если бы они были числами, перед альфа и так что 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
*/
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...