凯撒密码在Javascript中使用shiftChar()函数和Array.map()方法
Caesar Cipher in Javascript using shiftChar() function and Array.map() method
我正试图通过阅读大量在线教程来学习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));
- 如何迭代Array.prototype函数
- 检测未绑定的本机函数,如“Array.push”
- ASP MVC 将 Array 对象发送到 JavaScript 函数
- Array.from 在 Array#map 中不能用作直接回调函数
- 将参数传递给 Array.forEach 回调函数
- Javascript Array 的求和函数问题
- "可变变量可从闭包“”访问;在传递给Array.prototype.every的函数中
- 在JavaScript中调用array()作为构造函数时,返回的是什么类型的数组
- Array.insert函数错误,因为Object函数Array(){〔本机代码〕}没有方法'插入'
- jQuery的返回值是Array,但构造函数是Object.如何
- JavaScript 的 Array 调用和函数在 Prototype 中失败
- 为什么 Array.Length = 1 当空数组通过 ajax 传递给函数时
- 若将Array对象添加到Array原型中,则不遍历该对象的函数
- 如何将codeigniter DB array传递给JavaScript函数
- 获取 Array.forEach 函数的返回值
- array.forEach之后的回调函数
- Array.map 和 Javascript 中的提升函数
- 返回不同类型的JavaScript函数(Array vs NodeList)
- 试着理解这个函数:Array.prototype.reverse = function(){
- 我可以创建一个javascript数组函数array.method()吗