无法修复凯撒代码练习中的大写

Cant fix capitalization in Caesar's code exercise

编程新手,非常感谢任何帮助。

我被要求创建一个函数,该函数 return 是一个在字母表中具有给定移位的字符串。 例如:function caesar('a', 1) 应该是 return b.

转换必须保留大写,不应转换标点符号,应环绕字母表,负数应有效。

除大写外,我可以通过以下方式完成上述所有工作:

const caesar = function(string,shift) {
    let stringSplitted = string.split('');
    let cypher = [];
    stringSplitted.map( letter => {
    if (letter === ' ' || letter === ',' || letter === '!' || letter === '.') {
     return cypher.push(letter);
   }
   let index = alphabet.indexOf(letter);
   if (index + shift > 25) {
    cypher.push(alphabet[(index + shift) - alphabet.length])
   }
   else if(index + (shift)<0) {
    return cypher.push(alphabet[(index + shift) + alphabet.length])
   }
   else
    cypher.push(alphabet[index + shift]);
 })
  return cypher.join('')
}

我知道这很乱。 每当我在字符串中添加大写字母时,结果就会失控

我试过了

 if  (letter === letter.toLowerCase()) 
 return cypher.push(alphabet[index + shift].toUpperCase())

但它 return 的索引和移位未定义

可能的想法是您使用 ASCII codes,而不是为字母表使用自定义数组,在这种情况下,值 1 对于 'a' 的偏移是 'b','A' 是 'B'。

const caesar = function(string, shift) {
  return string.split('').map( letter => {
    if (!/[a-z0-9]+$/i.test(letter)) { // Do the shift only for numbers and letters
      return letter;
    } else {
      return String.fromCharCode( letter.charCodeAt(0) + shift ); // return ascii code + shift
    }
  }).join('');
}

console.log(caesar('abAB', 1));

console.log(caesar('Lorem Ipsum 5', 2));