Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   javascript сортировка option и value по алфавиту (https://javascript.ru/forum/dom-window/74169-javascript-sortirovka-option-i-value-po-alfavitu.html)

рони 20.06.2018 23:22

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

<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>

laimas 21.06.2018 08:41

Ну вот, можем же когда хотим ) На форуме нужно создать раздел "Бардачок" куда и складывать подобные функции, с описанием (как полагается). Вот только название функции не отражает ее сути, должно быть понятно, что это "natural order". В РНР это функция natsort, тоже не совсем удачное название.

рони 21.06.2018 08:51

laimas,
:) sortNatural

laimas 21.06.2018 09:01

Да, с таким названием и маркетингу легче будет. :)

Alexandroppolus 21.06.2018 09:25

Небольшое уточнение: понятно, что строка "abc123" разбивается на 2 куска - "abc" и число 123

А вот, скажем, "a b c" - тут один кусок или три, разделенных пробелами? В общем, каков статус пробелов, а так же всяких значков, тире, подчеркивания, и тд. Они принадлежат строковым кускам или считаются разделителями? Или, по другому, какие символы входят в строковый кусок, кроме букв

рони 21.06.2018 09:30

Цитата:

Сообщение от Alexandroppolus
a b c" - тут один кусок или три,

один, в sortNatural пост№51 не хватает варианта замены strToArr на иную функцию, которая разделит строку, так как вам нужно
в простом варианте выделяются только числовые блоки и строчные и идёт сравнение по блокам, при этом
блок-строка больше блок-числа, и где больше блоков если остальные одинаковы


Часовой пояс GMT +3, время: 12:18.