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

我试图通过阅读大量在线教程来学习Javascript,并通过解决coderbyte方面的挑战来练习。 我遇到了CaesarCipher挑战。 该函数需要一个字符串和一个偏移量参数,然后返回字符串,每个字母字符都被提供的任何偏移量(保留任何非alpha字符)保持不变。 我有我的shiftChar()函数工作,它将采取字符和偏移量,并将只适用于字母字符的移位,并将返回新的字符。 现在完成了,我认为我可以将原始字符串分割成数组,然后使用我的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参考:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map

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


如果您需要在映射数组时对参数化shiftChar函数进行参数化,则可以对它进行压缩以便一次只使用一个参数:

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));
链接地址: http://www.djcxy.com/p/26493.html

上一篇: Caesar Cipher in Javascript using shiftChar() function and Array.map() method

下一篇: Custom Router in Playframework 2.4