Цитата:
|
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, время: 21:49. |