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

标签 javascript algorithm transliteration

我实现了一个音译函数,现在结果是andrejhannanov,但我还需要得到andreiandrey khannanov。我可以在不复制存在 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'],
    'й': ['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"

关于javascript - 通过几种不同的方式进行音译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31544355/

相关文章:

javascript - 谷歌地图 API |当外面很黑时(取决于时间)如何更改 map 样式(复古到夜间模式)?

javascript - 使用带有 text() 的子字符串来删除 html 标签?

algorithm - 用于差异比较的 Merkle 树,在 Cassandra 中

translation - 将文件名转换为仅使用拉丁字符

c++ - 使用 ICU 进行分词

Javascript 更改 innerHTML 函数不起作用

javascript - 检查<select>中选定的项目-Roll?

c++ - 为我的图形数据结构实现 BFS 时出现问题

c++ - 在二维数组中创建线性渐变

ruby - iconv 将来会被弃用,音译