Показать сообщение отдельно
  #3 (permalink)  
Старый 09.06.2023, 09:07
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,708

Что то типа такого приходит на ум
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

Последний раз редактировалось voraa, 09.06.2023 в 18:17.
Ответить с цитированием