const al = "АБВГДЕЁЖЗИКЛМНОПРСТУФХЦЧШЩЫЬЭЮЯ "; // Алфавит
let key1 = "ПЕРВЫЙ"; // первый ключ
let key2 = "БУКВА"; // второй ключ
let open_str = "ЭТО СТРОКА ОТКРЫТОГО ИСХОДНОГО ТЕКСТА"; // кодируемый текст
// т.к. в алфавите нет букв Й и Ъ, то производим соответствующую замену:
key1 = key1.replace("Й","И").replace("Ъ","Ь");
key2 = key2.replace("Й","И").replace("Ъ","Ь");
open_str = open_str.replace("Й","И").replace("Ъ","Ь");
// кодируем текст
let encoded_str = ([...open_str]).map( (e,i) => al[(al.indexOf(e) + al.indexOf(key1[i%key1.length]) + al.indexOf(key2[i%key2.length])) % 32] ).join("");
console.log(encoded_str);
PS:
к строке по сути можно обращаться как к массиву - str[index]
про .map смотрим здесь -
https://developer.mozilla.org/en-US/docs/Web/JavaS...
если вам надо прям вот на МАССИВАХ, то просто сделайте соответствующие переменные "массивами"
строку в массив можно разбить так str.split("") или [...str]
по скрипту
al - строка / массив букв алфавита
al.indexOf(char) - получаем индекс буквы в алфавите
по выбору символа из ключа - т.к. ключ у нас заитерирован, то берем остаток от деления индекса кодируемого символа на длину ключа , это и будет символ из ключа - key1[i%key1.length], далее получаем его код по алфавиту - al.indexOf(key1[i%key1.length])
и у вас много ошибок в таблице, например в третьей строке - конечный символ не И, а З
и т.д.