Javascript.RU

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

расширенная сортировка строк 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
Ответить с цитированием
  #52 (permalink)  
Старый 21.06.2018, 08:41
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

Ну вот, можем же когда хотим ) На форуме нужно создать раздел "Бардачок" куда и складывать подобные функции, с описанием (как полагается). Вот только название функции не отражает ее сути, должно быть понятно, что это "natural order". В РНР это функция natsort, тоже не совсем удачное название.
Ответить с цитированием
  #53 (permalink)  
Старый 21.06.2018, 08:51
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,068

laimas,
sortNatural
Ответить с цитированием
  #54 (permalink)  
Старый 21.06.2018, 09:01
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

Да, с таким названием и маркетингу легче будет.
Ответить с цитированием
  #55 (permalink)  
Старый 21.06.2018, 09:25
Аватар для Alexandroppolus
Профессор
Отправить личное сообщение для Alexandroppolus Посмотреть профиль Найти все сообщения от Alexandroppolus
 
Регистрация: 25.10.2016
Сообщений: 1,005

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

А вот, скажем, "a b c" - тут один кусок или три, разделенных пробелами? В общем, каков статус пробелов, а так же всяких значков, тире, подчеркивания, и тд. Они принадлежат строковым кускам или считаются разделителями? Или, по другому, какие символы входят в строковый кусок, кроме букв
Ответить с цитированием
  #56 (permalink)  
Старый 21.06.2018, 09:30
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,068

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

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



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
JavaScript - Option, результаты из выпадающего меню. Результаты с большим количеством voron1990 Общие вопросы Javascript 3 30.04.2015 09:04
Сортировка таблицы по алфавиту dozer Events/DOM/Window 6 18.10.2014 00:22
как с помощью javascript установить selected для тега option? re-kru-t Общие вопросы Javascript 1 19.02.2011 15:49
Последние книги по JavaScript! monolithed Учебные материалы 7 26.10.2010 19:40
Выдвет ошибку JavaScript Ромио Opera, Safari и др. 4 21.10.2010 20:34