使用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