Сортировка смешанного массива.
Есть массив, в котором находятся имена файлов. Задача отсортировать массив в алфавитном порядке, то есть так, как эти имена файлов отображаются в файловом менеджере.
Если имена состоят только из букв или только из цифр, то легко: var myFilteredFiles = ["A", "B", "C", "g10", "g8", "g1", "11", "H"]; myFilteredFiles.sort(function(x, y){ var r = x - y; if(isNaN(r)){ r = isNaN(x) - isNaN(y); if(r == 0) r = x.toLocaleLowerCase().localeCompare(y.toLocaleLowerCase()); } return r; }); Получим ["1", "8", "10", "11", "A", "B", "C", "H"] Но если в именах встречаются и буквы и цифры, то сортировка не получается: ["A", "B", "C", "g10", "g8", "g1", "11", "H"] -> ["11", "A", "B", "C", "g1", "g10", "g8", "H"]. А должно быть ["11", "A", "B", "C", "g1", "g8", "g10", "H"] |
koros,
нужна так называемая "натуральная сортировка", поищите это на форуме, когда-то об этом была речь, там и код есть. |
koros,
<script> const collator = new Intl.Collator(["en", "ru"], { numeric: true }); const myFilteredFiles = ["A", "B", "C", "g10", "g8", "g1", "11", "H"]; myFilteredFiles.sort(collator.compare); document.write(JSON.stringify(myFilteredFiles, "", 4)) </script> |
рони,
Спасибо. Но у меня ругается на Intl.Collator: Цитата:
|
koros,
а так? <script> const sort = (a, b) => a.localeCompare(b, ["en", "ru"], { numeric: true }); const myFilteredFiles = ["A", "B", "C", "g10", "g8", "g1", "11", "H"]; myFilteredFiles.sort(sort); document.write(JSON.stringify(myFilteredFiles, "", 4)) </script> |
koros,
на всякий случай https://github.com/wessberg/polyfiller#readme |
Вот, что то такое изобрел. Может пойдет в Adobe
<script> function nsort (a,b) { a = a.toLowerCase(); b = b.toLowerCase(); var re = /(\D*)((0*)(\d*))(.*)/; var ra = re.exec(a) var rb = re.exec(b) if (ra[4].length && rb[4].length) { if(ra[1] === rb[1]) { if (ra[3].length != rb[3].length) return rb[3].length - ra[3].length var na = +ra[2] var nb = +rb[2] if (na != nb) return na - nb; } else { return ra[1]>rb[1]? 1 : (ra[1]<rb[1]? -1 : 0); } if (ra[5].length || rb[5].length) return nsort(ra[5], rb[5]) return 0; } return a>b? 1 : (a<b? -1 : 0); } const arr = ["A", "B", "C", "x1a3", "x1a", "x1b", "x01a", "011", "g10", "x1a02", "g8", "g1", "g01", "g001", "g081", "11", "H", "x1a2", "b0", "b00"] arr.sort(nsort) console.log(arr) document.write(JSON.stringify(arr)) </script> Предполагается, что x001 < x01 <x1, но x0 < x00 |
Извиняюсь, что долго не отвечал - был далеко от компьютера.
Цитата:
Цитата:
|
koros,
для чего это в конечном итоге? |
Я уже говорил - для Adobe Illustrator-а. С помощью скрипта открываю по очереди файлы в Illustrator-е и обрабатываю, в частности считываю содержимое текстовых фреймов в текстовый файл. Требуется, чтобы файлы обрабатывались в том же порядке, в каком они отображаются в файловом менеджере. Для проверки работы скрипта в адобовской программе удобно использовать adobe extendscript toolkit cc.
|
Часовой пояс GMT +3, время: 14:17. |