Как обработать массивы?
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])
и у вас много ошибок в таблице, например в третьей строке - конечный символ не И, а З
и т.д.snippet
Как я понял:
Есть алфавит с соответствиями кодов: 0 - А, 1- Б, 2 - В, 3 - Г, и т.д.[Код символа из алфавита] = ([код буквы сообщения] + [код буквы ключа1] + [код буквы ключа2]) mod 32mod - это остаток от деления суммы на 32 (также "mod", иногда обозначают знаком процента: "%" ).
Складываем числа, делим, получаем остаток, смотрим букву на основании алфавита.