Перебираем массив символов методом .map() в поисках его соответствия символу в алфавите. Внутри callback функции перебираем алфавит методом .forEach(), сравниваем символ из "мап" с символами алфавита. Соответствие нашли, ура! Теперь требуется сдвинуть соответствующую позицию на число N, взять соответствующий ей символ и ремапить массив.
Я говорю про шифр Цезаря если что.
Отчего, хочется понять, в нижеприведенном коде "item из .map()" можно присвоить значение "item из алфавита" только если порядковый номер "item из алфавита" больше или равен значению сдвига(N). А если надо продолжить сдвиг с конца массива, то присваивается черт те что!
Собственно вот:
function Caesar(arr){
var analisedArr=[];
var alphabet="ABCDEFGHIJKLMNOPQRSTUVWXYZ".split("");
var len=alphabet.length;
var returnedStr=[];
var shift=+arr.shift().substring(2);
for (var i=0; i<arr.length; i++){
analisedArr=arr[i].split(" ");//разбиваем строку на слова
for (var j=0;j<analisedArr.length;j++){
returnedStr.push((analisedArr[j].split("").map(function(ch){//ищем "правильный" символ
alphabet.forEach(function(item,n,alphabet){//перебирая алфавит
if (ch==item){ch=(n>=shift ? alphabet[n-shift]:alphabet[len-shift+n]);}
})
return ch;
})).join(""));
}
}
return returnedStr.join(" ");
}
какое влияние здесь имеет "ch", что не дает доступа к последним элементам алфавита?
п.с. Проблему решил введением в callback-функцию из "мап" отдельной переменной:
returnedStr.push((analisedArr[j].split("").map(function(ch){
var cch="";
alphabet.forEach(function(item,n,alphabet){
if (ch==item){cch=(n>=shift ? alphabet[n-shift]:alphabet[len-shift+n]);}
})
return cch;
})).join(""));
И все же? Что я делал не так?