Недавно столкнулся с вполне ясной и скорее всего распространённой задачей когда необходимо создать имя файла из набора переменных и последняя часть должна включать в себя имя компании. Т.к. файл в процессе кочует по серверам и его конечная точка для пользователя - это хранилище S3, то решено было максимально позаботиться о 2-х моментах: в имени файла не должно быть пробелов, имя файла состоит строго из латинских символов, хоть S3 (если разработан на правильных стандартах) и поддерживает Unicode.
Чтобы не захломлять строками кода основной программный модуль, то решено было сделать так:
const str = 'АО "Рога и Копыта и Терентьев"';
const result = (s => s.replace(/"/g, '').replace(/\s+/g, '_').replace(/[а-яё]/gi, c => ({'а':'a','б':'b','в':'v','г':'g','д':'d','е':'e','ё':'e','ж':'zh','з':'z','и':'i','й':'y','к':'k','л':'l','м':'m','н':'n','о':'o','п':'p','р':'r','с':'s','т':'t','у':'u','ф':'f','х':'h','ц':'c','ч':'ch','ш':'sh','щ':'shch','ъ':'','ы':'y','ь':'','э':'e','ю':'yu','я':'ya'}[c.toLowerCase()] || c).replace(/^./, x => x.toUpperCase())))(str);
console.log(result);
// Вывод: AO_Roga_i_Kopyta_i_Terentev
Немного пояснений к каждой части replace с применением регулярных выражений:
.replace(/"/g, '')— удаляет все двойные кавычки..replace(/\s+/g, '_')— заменяет пробелы (и группы пробелов) на один знак подчеркивания _..replace(/[а-яё]/gi, ...)— перебирает все русские буквы и заменяет их на латинские согласно массива.- В массиве: '
ь': '' — мягкий знак просто отсутствует, поэтому он исключается. - Логика внутри сохраняет регистр (заглавные остаются заглавными).
- В примере "
Терентьев" превращается в "Terentev" (мягкий знак исчезает).