Цитата:
|
laimas,
бред какой-то ... я писал выше, что не понимаю ... |
Цитата:
сейчас посмотрел в консоли, что выведет 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; }) |
laimas,
не совсем понял, какую мысль ты хочешь донести. есть sort, который сортирует элементы как строки, по возрастанию для любого другого кейса не обойтись без кастомной функции сравнения в чем загвоздка? |
Никакого подвоха, но не под каждое же имя файла своя функция. А такого добра много, адреса и т.п.
|
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); })); |
j0hnik,
ну чего под ответ подгонять :) Сразу пишите функцию для натуральной сортировки (хотя для JS это уже давно написано), а данная то опять для этого конкретного случая. |
Цитата:
|
Цитата:
А если стоит задача сортировки, к примеру, списка файлов, с возможностью сортировки по набору параметров (пусть отсортировать по типу файлов и имени, то есть первичное тип, а в нем уже имена и т.п.), тогда да, это можно считать узко специализированной задачей (ТЗ), заточили под нее скрипт. |
Цитата:
|
расширенная сортировка строк 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> |
Ну вот, можем же когда хотим ) На форуме нужно создать раздел "Бардачок" куда и складывать подобные функции, с описанием (как полагается). Вот только название функции не отражает ее сути, должно быть понятно, что это "natural order". В РНР это функция natsort, тоже не совсем удачное название.
|
laimas,
:) sortNatural |
Да, с таким названием и маркетингу легче будет. :)
|
Небольшое уточнение: понятно, что строка "abc123" разбивается на 2 куска - "abc" и число 123
А вот, скажем, "a b c" - тут один кусок или три, разделенных пробелами? В общем, каков статус пробелов, а так же всяких значков, тире, подчеркивания, и тд. Они принадлежат строковым кускам или считаются разделителями? Или, по другому, какие символы входят в строковый кусок, кроме букв |
Цитата:
в простом варианте выделяются только числовые блоки и строчные и идёт сравнение по блокам, при этом блок-строка больше блок-числа, и где больше блоков если остальные одинаковы |
Часовой пояс GMT +3, время: 18:37. |