我实现了音译功能,现在结果为andrej
和hannanov
,但我还需要andrei
,andrey
和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('ханнанов'));
答案 0 :(得分:1)
如何使用数组表示不同的可能音译并使用递归来枚举所有可能性:
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);
答案 1 :(得分:1)
试试这个:
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"