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)

laimas 19.06.2018 22:35

Цитата:

Сообщение от рони
с новым набором будет иной код ... какое будет тз, такая и будет сортировка, ...

Не много ли случаев? :) Писать так уж пользовательскую сортировку сразу, так как с буквенно-цифровыми строками не достаточно только a > b ? 1 : a < b ? -1 : 0.

рони 19.06.2018 22:50

laimas,
бред какой-то ... я писал выше, что не понимаю ...

Alexandroppolus 19.06.2018 23:02

Цитата:

Сообщение от j0hnik (Сообщение 487777)
Alexandroppolus,
может и есть но, с маленьким вроде все логично выводит, а там пытается "хитрить"

да нет никакой хитрости, результат логичный в обоих кейсах.
сейчас посмотрел в консоли, что выведет
var arr = [1, 2, 3, 4, 5, 6];
arr.sort(function(a, b) { console.log(a, b, arr); return 1; })

судя по логу, тут "сортировка вставками". И в callback элементы попадают ровно в той последовательности, в какой изначально друг относительно друга находятся.

а если длина более 10, то используется "быстрая сортировка", с перекидываниями элементов туда-сюда, и пары образуются как возрастающие, так и убывающие
var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12];
arr.sort(function(a, b) { console.log(a, b, arr); return 1; })

Alexandroppolus 19.06.2018 23:15

laimas,

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

laimas 20.06.2018 04:03

Никакого подвоха, но не под каждое же имя файла своя функция. А такого добра много, адреса и т.п.

j0hnik 20.06.2018 04:47

console.log(["iag12.png", "iq10.png", "img2.png", "img1.png"].sort(function(a, b) {
	var aw = a.match(/\D+/)[0],
	bw = b.match(/\D+/)[0],
	ad = a.match(/\d+/)[0],
	bd = b.match(/\d+/)[0];
  return (aw > bw) - (aw < bw) || (ad-bd) - (bd-ad);
}));

laimas 20.06.2018 05:14

j0hnik,
ну чего под ответ подгонять :) Сразу пишите функцию для натуральной сортировки (хотя для JS это уже давно написано), а данная то опять для этого конкретного случая.

рони 20.06.2018 07:46

Цитата:

Сообщение от laimas
Сразу пишите функцию для натуральной сортировки (хотя для JS это уже давно написано),

можно узнать о чём речь?

laimas 20.06.2018 08:08

Цитата:

Сообщение от рони
можно узнать о чём речь?

Достаточно заменить в коде j0hnik, массив, и пусть это будут например адреса - ["a 10a", "a 1b", "a 2", "a 1"], и не получим желаемого, ибо его код "подогнан" под конкретный вопрос. Что же не написать одну пользовательскую функцию, а не всякий раз новую под конкретный случай? Проблемы когда строка, это числа и буквы ведь давно известна, поэтому и решения готовые уже давно есть/предлагаются.

А если стоит задача сортировки, к примеру, списка файлов, с возможностью сортировки по набору параметров (пусть отсортировать по типу файлов и имени, то есть первичное тип, а в нем уже имена и т.п.), тогда да, это можно считать узко специализированной задачей (ТЗ), заточили под нее скрипт.

рони 20.06.2018 08:51

Цитата:

Сообщение от laimas
решения готовые уже давно есть/предлагаются.

спасибо

рони 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, время: 18:37.