凯撒密码在Javascript中使用shiftChar()函数和Array.map()方法

Caesar Cipher in Javascript using shiftChar() function and Array.map() method

本文关键字:函数 Array 方法 map shiftChar 密码 Javascript 凯撒      更新时间:2023-09-26

我正试图通过阅读大量在线教程来学习Javascript,并通过在coderbyte上的挑战来练习。我在凯撒密码挑战中遇到了麻烦。该函数需要接受一个字符串和一个偏移量参数,然后返回字符串,其中每个alpha字符按所提供的偏移量移动(保留任何非alpha字符完整)。我已经让我的shiftChar()函数工作,它将接受字符和偏移量,并将仅对alpha字符应用移位,并将返回新字符。现在已经完成了,我想我可以只使用原始字符串,将其拆分为一个数组,然后使用我的shiftChar()函数将该字符数组映射到一个新数组。然而,我不能让它工作,我似乎不知道为什么。

是有什么我错过了关于地图方法?我的理解是map方法将自动传递它所调用的数组中的每个元素作为第一个参数。然后我只是传递我的偏移值作为一个额外的参数。有人可以请透露一些光,为什么这是不工作,并建议一个更可行的方法?

/*
Using the JavaScript language, have the function CaesarCipher(str,num) take the str parameter and perform a Caesar Cipher shift on it using the     num parameter as the shifting number. A Caesar Cipher works by shifting each letter in the string N places down in the alphabet (in this case N will be num). Punctuation, spaces, and capitalization should remain intact. For example if the string is "Caesar Cipher" and num is 2 the output should be "Ecguct Ekrjgt". 
*/
var str = 'Caesar Cipher';
function CaesarCipher(str, offset){  
  var charArray = str.split('');
  var result = charArray.map( shiftChar( char, offset )).join('');  
  function shiftChar(char, offset){
    var isAlpha = /[A-z]/;
    if(isAlpha.test(char)){
      char = String.fromCharCode(char.charCodeAt(0) + offset);
      if(char > 'Z' && char < 'a' || char > 'z')
        char = String.fromCharCode(char.charCodeAt(0) - 26);
    }
    return char;
  }
  return result;
}
console.log(CaesarCipher( str, 2));

您的代码中有一些东西会阻止您获得预期的结果。

Array.map()返回一个数组,它不修改原始数组。在您的示例中,您将新数组存储到result,但您的函数返回原始charArray,而不是result,这是您想要的。

第二个问题是您提供给map的回调函数。map的第一个参数应该是一个函数,但是shiftChar( char, offset)不是一个函数,它是调用shiftChar的结果。(我希望这部分是有意义的)。通常在使用map时,您将创建一个匿名函数,该函数将接收下面文档中指定的参数。在您的情况下,您需要执行以下操作:

var result = charArray.map( function(char) { return shiftChar(char, offset); } ).join('');

Array.map reference: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map

完整的jsfiddle示例:http://jsfiddle.net/p2fkLs2t/

如果在映射数组时需要参数化shiftChar函数,可以对其进行curry,使其每次只接受一个参数:

function shiftChar(offset) {
    return function(char) {
        var isAlpha = /[a-z]/i;
        if(isAlpha.test(char)){
          char = String.fromCharCode(char.charCodeAt(0) + offset);
          if(char > 'Z' && char < 'a' || char > 'z')
            char = String.fromCharCode(char.charCodeAt(0) - 26);
        }
        return char;
    }
}

所以你必须把它命名为shiftChar(22)('a')来移动字母"A"22。

让你做"Hello".split("").map(shiftChar(22));

应该可以:

var str = 'Caesar Cipher';
function CaesarCipher(str, offset){  
  var charArray = str.split('');
  function shiftChar(char){
    var isAlpha = /[a-z]/i;
    if(isAlpha.test(char)){
      char = String.fromCharCode(char.charCodeAt(0) + offset);
      if(char > 'Z' && char < 'a' || char > 'z')
        char = String.fromCharCode(char.charCodeAt(0) - 26);
    }
    return char;
  }
  var result = charArray.map( shiftChar ).join('');  
  return result;
}
console.log(CaesarCipher( "test", 2));