Показать сообщение отдельно
  #51 (permalink)  
Старый 20.06.2018, 23:22
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,124

расширенная сортировка строк sortNatural
вариант по алгоритму из готовых решений ...

<script>
function sortNatural(arr) {
    function isDigit(a) {
        a = a.charCodeAt(0);
        return a >= 47 && a <= 57
    }

    function strToArr(a) {
        var b = {
                type: isDigit(a[0]),
                str: ""
            },
            c = [b];
        c.item = a;
        for (var i = 0; i < a.length; i++) {
            var e = a[i],
                type = isDigit(e);
            if (b.type == type) b.str += e;
            else {
                b = {
                    type: type,
                    str: e
                };
                c.push(b)
            }
        }
        return c
    }

    function compare(a, b) {
        var length = Math.min(a.length, b.length);
        for (var i = 0; i < length; i++) {
            var typeA = a[i].type,
                typeB = b[i].type,
                strA = a[i].str,
                strB = b[i].str;
            if (typeA === typeB && strA !== strB) return typeA ? strA - strB : strA > strB ? 1 : -1;
            if (typeA !== typeB) return typeA ? -1 : 1
        }
        return a.length - b.length
    }
    return arr.map(strToArr).sort(compare).map(function(el) {
        return el.item
    })
};



var arr = ["a 10a", "a 1b", "a 2", "a 1"];
arr = sortNatural(arr);
document.write(JSON.stringify(arr, null, 4)+"<br>");
arr = ["iag12.png", "iq10.png", "img2.png", "img1.png"];
arr = sortNatural(arr);
document.write(JSON.stringify(arr, null, 4)+"<br>")
arr = ["img12.png", "img10.png", "img2.png", "img1.png"];
arr = sortNatural(arr);
document.write(JSON.stringify(arr, null, 4)+"<br>");
arr = ['Банан', 'Абрикос', 'Зелень'];
arr = sortNatural(arr);
document.write(JSON.stringify(arr, null, 4)+"<br>");
arr = "12345678901234567890".split("");
arr = sortNatural(arr);
document.write(JSON.stringify(arr, null, 4)+"<br>");
</script>

Последний раз редактировалось рони, 21.06.2018 в 09:22. Причина: sortNatural
Ответить с цитированием