Что то типа такого приходит на ум
const tabSurname = [
['(.*)(аил)$', [1, 'айлович'], [1, 'айловна']],
['(.*)(ей)$', [1, 'еевич'], [1, 'еевна']],
['(.*)(ай)$', [1, 'аевич'], [1, 'аевна']],
['(.*)(ий)$', [1, 'ьевич'], [1, 'ьевна']],
['(.*)([аеиоуэюя])$', [1, 'ич'], [1, 'ична']],
['(.*)$', [1, 'ович'], [1, 'овна']],
]
const genSurname = (mask, ...pars) => {
return mask.reduce ((a, v) => a + (typeof v === 'number' ? pars[v] : v), '');
}
const getSurname = (name) => {
let maleSurname, femaleSurname;
name = name.toLowerCase();
for (const sn of tabSurname) {
const re = new RegExp(sn[0]);
if (name.match(re)) {
maleSurname = name.replace(re, (...pars) => genSurname(sn[1], ...pars));
femaleSurname = name.replace(re, (...pars) => genSurname(sn[2], ...pars));
maleSurname = maleSurname[0].toUpperCase() + maleSurname.slice(1);
femaleSurname = femaleSurname[0].toUpperCase() + femaleSurname.slice(1);
break;
}
}
return [maleSurname, femaleSurname]
}
let name, msname, fmsname;
while (true) {
name = prompt('Имя')
if (! name ) break;
[msname, fmsname] = getSurname (name);
alert (msname + ' ' + fmsname);
}
Лень перебирать все имена, но всегда можно добавить в таблицу другое правило или исключение.
ЗЫ У меня prompt почему то срабатывает только, если открыт DevTools