JavaScript: естественный вид алфавитно-цифровых строк

Я ищу самый легкий способ отсортировать массив, который состоит из чисел и текста и комбинации их.

Например.

'123asd'
'19asd'
'12345asd'
'asd123'
'asd12'

превращается

'19asd'
'123asd'
'12345asd'
'asd12'
'asd123'

Это будет используемым в сочетании с решением другого вопроса, который я задал здесь.

Функция сортировки сам по себе работает, в чем я нуждаюсь, функция, которая может сказать, что это '19asd' меньше, чем '123asd'.

Я пишу это в JavaScript.

Править: как adormitu указанный, то, что я ищу, является функцией для естественной сортировки

138
задан Community 23 May 2017 в 12:34
поделиться

2 ответа

Так вам нужна естественная сортировка ?

Если да, то, возможно, этот скрипт Брайана Хуисмана, основанный на работе Дэвида Коэлла, будет тем, что вам нужно.

Похоже, что решение Брайана Хуисмана теперь размещено непосредственно в блоге Дэвида Коэлла:

45
ответ дан 23 November 2019 в 23:26
поделиться

Для сравнения значений вы можете использовать метод сравнения-

function naturalSorter(as, bs){
    var a, b, a1, b1, i= 0, n, L,
    rx=/(\.\d+)|(\d+(\.\d+)?)|([^\d.]+)|(\.\D+)|(\.$)/g;
    if(as=== bs) return 0;
    a= as.toLowerCase().match(rx);
    b= bs.toLowerCase().match(rx);
    L= a.length;
    while(i<L){
        if(!b[i]) return 1;
        a1= a[i],
        b1= b[i++];
        if(a1!== b1){
            n= a1-b1;
            if(!isNaN(n)) return n;
            return a1>b1? 1:-1;
        }
    }
    return b[i]? -1:0;
}

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

function naturalSort(ar, index){
    var L= ar.length, i, who, next, 
    isi= typeof index== 'number', 
    rx=  /(\.\d+)|(\d+(\.\d+)?)|([^\d.]+)|(\.(\D+|$))/g;
    function nSort(aa, bb){
        var a= aa[0], b= bb[0], a1, b1, i= 0, n, L= a.length;
        while(i<L){
            if(!b[i]) return 1;
            a1= a[i];
            b1= b[i++];
            if(a1!== b1){
                n= a1-b1;
                if(!isNaN(n)) return n;
                return a1>b1? 1: -1;
            }
        }
        return b[i]!= undefined? -1: 0;
    }
    for(i= 0; i<L; i++){
        who= ar[i];
        next= isi? ar[i][index] || '': who;
        ar[i]= [String(next).toLowerCase().match(rx), who];
    }
    ar.sort(nSort);
    for(i= 0; i<L; i++){
        ar[i]= ar[i][1];
    }
}
23
ответ дан 23 November 2019 в 23:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: