как отсортировать строки в javascript численно

Я хотел бы отсортировать массив строк (в javascript) так, чтобы группы цифр внутри строк сравнивались как целые числа, а не строки. Меня не беспокоят числа со знаком или с плавающей запятой.

например, результат должен быть [«a1b3», «a9b2», «a10b2», «a10b11»] не [«a1b3», «a10b11», «a10b2», "a9b2"]

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

"abc11def22ghi" .split (/? /) = ["Abc", "11", "def", "22 "," ghi "];

Или есть другой способ сравнения строк, который не предполагает их разделения, например, путем дополнения всех групп цифр ведущими нулями, чтобы они имели одинаковую длину?

" aa1bb "= > "aa00000001bb", "aa10bb" => "aa00000010bb"

Я работаю с произвольными строками, а не с строками с определенным расположением групп цифр.

Редактировать:

Мне нравится / (\ d +) / один лайнер от Габи для разделения массива. Насколько это обратно совместимо?

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

["a100","a20","a3","a3b","a3b100","a3b20","a3b3","!!","~~","9","10","9.5"].sort( function ( inA , inB ) {
    var                     result = 0;

    var                     a , b , pattern = /(\d+)/;
    var                     as = inA.split( pattern );
    var                     bs = inB.split( pattern );
    var                     index , count = as.length;

    if ( ( '' === as[0] ) === ( '' === bs[0] ) ) {
        if ( count > bs.length ) count = bs.length;

        for ( index = 0 ; index < count && 0 === result ; ++index ) {
            a = as[index]; b = bs[index];

            if ( index & 1 ) {
                result = a - b;
            } else {
                result = !( a < b ) ? ( a > b ) ? 1 : 0 : -1;
            }
        }

        if ( 0 === result ) result = as.length - bs.length;
    } else {
        result = !( inA < inB ) ? ( inA > inB ) ? 1 : 0 : -1;
    }

    return result;
} ).toString();

результат: "!!, 9,9.5,10, a3, a3b, a3b3, a3b20, a3b100, a20, a100, ~~"

10
задан drawnonward 13 November 2011 в 00:19
поделиться