Я ищу самый легкий способ отсортировать массив, который состоит из чисел и текста и комбинации их.
Например.
'123asd'
'19asd'
'12345asd'
'asd123'
'asd12'
превращается
'19asd'
'123asd'
'12345asd'
'asd12'
'asd123'
Это будет используемым в сочетании с решением другого вопроса, который я задал здесь.
Функция сортировки сам по себе работает, в чем я нуждаюсь, функция, которая может сказать, что это '19asd' меньше, чем '123asd'.
Я пишу это в JavaScript.
Править: как adormitu указанный, то, что я ищу, является функцией для естественной сортировки
Так вам нужна естественная сортировка ?
Если да, то, возможно, этот скрипт Брайана Хуисмана, основанный на работе Дэвида Коэлла, будет тем, что вам нужно.
Похоже, что решение Брайана Хуисмана теперь размещено непосредственно в блоге Дэвида Коэлла:
Для сравнения значений вы можете использовать метод сравнения-
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];
}
}