我正在尝试通过阅读大量的在线教程来学习
Javascript,并且正在通过应对coderbyte的挑战来练习.我遇到了CaesarCipher挑战的问题.该函数需要获取一个字符串和一个偏移量参数,然后返回字符串,每个字母字符移动所提供的任何偏移量(保留任何非字母字符完整).我已经使用了shiftChar()函数,它将获取char和偏移量,并仅对alpha字符应用shift,并返回新字符.现在已经完成,我想我可以只取原始字符串,将其拆分为数组,然后使用我的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()返回一个数组,它不会修改原始数组.在您的示例中,您将新数组存储到结果中,但您的函数返回原始charArray,而不是结果,这是您想要的.
第二个问题是您要提供的回调函数. 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/