通过几种不同的方式进行音译

Transliterate by few different ways

我实现了音译功能,现在结果是andrejhannanov,但我还需要得到andreiandreykhannanov .我可以在不存在副本 map 的情况下更新我的功能并更改几个字母吗?

我的函数:

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

function fn (string) {
    var result = '';

    for (var i = 0; i < string.length; ++i) {
      result += map[string[i]];
    }

    return result;
}

console.log(fn('андрей'));
console.log(fn('ханнанов'));

如何使用数组表示不同的可能音译并使用递归来枚举所有可能性:

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

function fn(string, partial) {

  partial = !!partial ? partial : '';

  var branched = false;
  for (var i = 0; i < string.length; ++i) {

    if (typeof map[string[i]] === 'object') {

      for (var j = 0 ; j < map[string[i]].length ; ++j) {
        branched = true;
        fn(string.substring(i + 1), partial + map[string[i]][j]);
      }


    } else {
      partial += map[string[i]];
    }
  }

  if (!branched) {
    results.push(partial);
  }
}

var results = [];

fn('андрей');
console.log(results);

results = [];
fn('ханнанов');
console.log(results);

试试这个:

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

function transliterate (source) {
    var result = [''];

    for (var i = 0; i < source.length; i++) {
        if (map[source[i]] !== undefined) {
            result = addMappedLetter(result, map[source[i]]);
        } else {
            result = addMappedLetter(result, [source[i]]);
        }
    }

    return result;
}

function addMappedLetter (source, letter) {
    var result = [];

    for (var i = 0; i < source.length; i++) {
        for (var j = 0; j < letter.length; j++) {
            result[(i * letter.length) + j] = source[i] + letter[j];
        }
    }

    return result;
}

我知道您想对 map 进行最少的修改,但除非您将数组分配给它的属性,否则它不会起作用。我的代码将简单地复制任何未映射的内容,因此即使有未映射的字符,您也可以使用它。
据我所知,它有效。我试过这个:

transliterate('2хйпу@hotmail.com').forEach(function(entry){console.log(entry)});
// console: undefined
//          "2hipu@hotmail.com"
//          "2hjpu@hotmail.com"
//          "2hypu@hotmail.com"
//          "2khipu@hotmail.com"
//          "2khjpu@hotmail.com"
//          "2khypu@hotmail.com"