Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 13.08.2020, 15:56
Новичок на форуме
Отправить личное сообщение для koros Посмотреть профиль Найти все сообщения от koros
 
Регистрация: 13.08.2020
Сообщений: 6

Сортировка смешанного массива.
Есть массив, в котором находятся имена файлов. Задача отсортировать массив в алфавитном порядке, то есть так, как эти имена файлов отображаются в файловом менеджере.
Если имена состоят только из букв или только из цифр, то легко:
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"]
Ответить с цитированием
  #2 (permalink)  
Старый 13.08.2020, 16:00
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,989

koros,
нужна так называемая "натуральная сортировка", поищите это на форуме, когда-то об этом была речь, там и код есть.
Ответить с цитированием
  #3 (permalink)  
Старый 13.08.2020, 16:39
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,123

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>
Ответить с цитированием
  #4 (permalink)  
Старый 14.08.2020, 10:30
Новичок на форуме
Отправить личное сообщение для koros Посмотреть профиль Найти все сообщения от koros
 
Регистрация: 13.08.2020
Сообщений: 6

рони,
Спасибо. Но у меня ругается на Intl.Collator:
Цитата:
Intl is undefined
Забыл сказать (может это важно) скрипт запускается из Adobe ExtendScript Toolkit и потом будет применяться в Adobe Illustrator.
Ответить с цитированием
  #5 (permalink)  
Старый 14.08.2020, 10:59
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,123

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>
Ответить с цитированием
  #6 (permalink)  
Старый 14.08.2020, 11:09
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,123

koros,
на всякий случай https://github.com/wessberg/polyfiller#readme
Ответить с цитированием
  #7 (permalink)  
Старый 14.08.2020, 12:05
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,750

Вот, что то такое изобрел. Может пойдет в 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

Последний раз редактировалось voraa, 17.08.2020 в 18:41.
Ответить с цитированием
  #8 (permalink)  
Старый 17.08.2020, 10:01
Новичок на форуме
Отправить личное сообщение для koros Посмотреть профиль Найти все сообщения от koros
 
Регистрация: 13.08.2020
Сообщений: 6

Извиняюсь, что долго не отвечал - был далеко от компьютера.
Сообщение от рони Посмотреть сообщение
koros,
а так?
Тоже не работает. Выделяет ">" и говорит, что "Cannot assign value"

Сообщение от voraa Посмотреть сообщение
Вот, что то такое изобрел. Может пойдет в Adobe
К сожалению, не получается. Сделал в конце вывод через алерт - каждый раз выводит отличную от предыдущей последовательность элементов массива arr и, естественно, неотсортированную(. Если не сложно - проверьте, пожалуйста, на adobe extendscript toolkit cc.
Ответить с цитированием
  #9 (permalink)  
Старый 17.08.2020, 11:07
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,989

koros,
для чего это в конечном итоге?
Ответить с цитированием
  #10 (permalink)  
Старый 17.08.2020, 11:42
Новичок на форуме
Отправить личное сообщение для koros Посмотреть профиль Найти все сообщения от koros
 
Регистрация: 13.08.2020
Сообщений: 6

Я уже говорил - для Adobe Illustrator-а. С помощью скрипта открываю по очереди файлы в Illustrator-е и обрабатываю, в частности считываю содержимое текстовых фреймов в текстовый файл. Требуется, чтобы файлы обрабатывались в том же порядке, в каком они отображаются в файловом менеджере. Для проверки работы скрипта в адобовской программе удобно использовать adobe extendscript toolkit cc.
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Задача сортировка одномерного массива Helen_Kim Общие вопросы Javascript 1 28.04.2019 15:04
Ввод и сортировка массива Neotwalker Элементы интерфейса 2 05.04.2018 00:14
Сортировка массива по возрастанию другого массива. vas88811 Events/DOM/Window 4 12.01.2014 10:31
Сортировка массива по ключу RazZzeR Элементы интерфейса 9 21.07.2012 19:31
Сортировка двумерного массива методом пузырька lammeR Общие вопросы Javascript 31 01.07.2012 20:48