使用shiftChar()函数和Array.map()方法在Javascript中使用Caesar Cipher

我正在尝试通过阅读大量的在线教程来学习 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/

相关文章

前言 做过web项目开发的人对layer弹层组件肯定不陌生,作为l...
前言 前端表单校验是过滤无效数据、假数据、有毒数据的第一步...
前言 图片上传是web项目常见的需求,我基于之前的博客的代码...
前言 导出Excel文件这个功能,通常都是在后端实现返回前端一...
前言 众所周知,js是单线程的,从上往下,从左往右依次执行,...
前言 项目开发中,我们可能会碰到这样的需求:select标签,禁...