Как транслитерировать текст обратно с английского на русский. JS

Я попробовал так, но он не работает так, как я хочу, например текст ch он должен переводить ч, но переводит ц х. Вот код:

var answer = '';
function translit(word) {
    var converter = {
        'a': 'а', 'b': 'б', 'v': 'в', 'g': 'г', 'd': 'д',
        'e': 'е', 'yo': 'ё', 'zh': 'ж', 'z': 'з', 'и': 'i',
        'y': 'й', 'k': 'к', 'l': 'л', 'm': 'м', 'n': 'н',
        'o': 'о', 'p': 'п', 'r': 'р', 's': 'с', 't': 'т',
        'u': 'у', 'f': 'ф', 'h': 'х', 'c': 'ц', 'ch': 'ч',
        'sh': 'ш', 'sch': 'щ', 'y': 'ы', 'yu': 'ю', 'ya': 'я',
    };

    for (var i = 0; i < word.length; i++) {
        if (converter[word[i]] == undefined) {
            answer += word[i];
        else {
            answer += converter[word[i]];
        }
    }
}
translit(event.target.value);

Ответы (1 шт):

Автор решения: vsemozhebuty

Вам нужно сначала целиком заменять сочетания большей длины, а потом меньшей.

В последних версиях JS гарантирован порядок перебора ключей объектов в порядке создания (если все ключи являются нецифровыми строками), так что, например, такой вариант должен работать (или можно вместо объекта использовать Map):

function translit(word) {
  const converter = {
    'sch': 'щ',

    'yo': 'ё', 'zh': 'ж', 'ch': 'ч', 'sh': 'ш', 'yu': 'ю', 'ya': 'я',

    'a': 'а', 'b': 'б', 'v': 'в', 'g': 'г', 'd': 'д',
    'e': 'е', 'z': 'з', 'и': 'i', 'y': 'й', 'k': 'к',
    'l': 'л', 'm': 'м', 'n': 'н', 'o': 'о', 'p': 'п',
    'r': 'р', 's': 'с', 't': 'т', 'u': 'у', 'f': 'ф',
    'h': 'х', 'c': 'ц', 'y': 'ы',
  };

  for (const [key, value] of Object.entries(converter)) {
    word = word.replaceAll(key, value);
  }

  return word;
}

console.log(translit('schuka'));
console.log(translit('yozh'));

→ Ссылка