На Тостере задали вопрос: как переписать скрипт транслитерации более аккуратно и с учётом регистра букв в изначальном предложении. Я решил почти полностью переписать функцию на свой лад и решить некоторые проблемы оригинала.
Собственно, моя реализация:
const rusToLat = function(str) { let ru = { 'а': 'a', 'б': 'b', 'в': 'v', 'г': 'g', 'д': 'd', 'е': 'e', 'ё': 'e', 'ж': 'j', 'з': 'z', 'и': 'i', 'к': 'k', 'л': 'l', 'м': 'm', 'н': 'n', 'о': 'o', 'п': 'p', 'р': 'r', 'с': 's', 'т': 't', 'у': 'u', 'ф': 'f', 'х': 'h', 'ц': 'c', 'ч': 'ch', 'ш': 'sh', 'щ': 'shch', 'ы': 'y', 'э': 'e', 'ю': 'u', 'я': 'ya', 'ъ': 'ie', 'ь': '', 'й': 'i' }; let newString = []; return [...str].map(l => { let latL = ru[l.toLocaleLowerCase()]; if (l !== l.toLocaleLowerCase()) { latL = latL.charAt(0).toLocaleUpperCase() + latL.slice(1); } else if (latL === undefined) { latL = l; } return latL; }).join(''); }
Таким образом:
const str = 'Я Тестовая СТРОКА... И во мне есть все, ну или почти, элементы знаков припинания!'; console.log(rusToLat(str)); //Ya Testovaya STROKA... I vo mne est vse, nu ili pochti, elementy znakov pripinaniya!
Ну и часто для спортивного интереса вот оригинал функции:
function rus_to_latin ( str ) { var ru = { 'а': 'a', 'б': 'b', 'в': 'v', 'г': 'g', 'д': 'd', 'е': 'e', 'ё': 'e', 'ж': 'j', 'з': 'z', 'и': 'i', 'к': 'k', 'л': 'l', 'м': 'm', 'н': 'n', 'о': 'o', 'п': 'p', 'р': 'r', 'с': 's', 'т': 't', 'у': 'u', 'ф': 'f', 'х': 'h', 'ц': 'c', 'ч': 'ch', 'ш': 'sh', 'щ': 'shch', 'ы': 'y', 'э': 'e', 'ю': 'u', 'я': 'ya', 'ъ': 'ie', 'ь': '', 'й': 'i' }, n_str = []; for ( var i = 0; i < str.length; ++i ) { n_str.push( ru[ str[i] ] || ru[ str[i].toLowerCase() ] == undefined && str[i] || ru[ str[i].toLowerCase() ].replace(/^(.)/, function ( match ) { return match.toUpperCase() }) ); } return n_str.join(''); }
По сложности они, по факту, одинаковы. Но моя реализация кажется более читаемой и учитывающей все проблемы оригинала и русского языка.