【问题标题】:Caesar Cipher (How do I convert for into .map)凯撒密码(如何转换为 .map)
【发布时间】:2017-08-04 20:37:02
【问题描述】:

这是一个凯撒密码程序,我自己写了这段代码,想把这个for循环转换成.map JavaScript内置函数,试了很多次还是搞不懂。

https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Map

这个网站上有很多关于 .map 的问题,但这对我不起作用。

function rot13(str) {
   var chArray = [];
   str = str.split("");
   
   for(var i in str){
    var char = str[i].charCodeAt(0);
     if(/[A-M]/g.test(str[i])){
       chArray.push(char + 13);
     }
     else if(/[N-Z]/g.test(str[i])){
       chArray.push(char - 13);
     }
     else chArray.push(char);
   }
   str = String.fromCharCode.apply(String,chArray);
  return str;
}

rot13("SERR PBQR PNZC");

【问题讨论】:

    标签: javascript loops for-loop caesar-cipher


    【解决方案1】:

    以下是使用map 的代码的简单改编(使用变量rotation 以避免重复代码):

    function rot13(str) {
       str = str.split("");
    
       var encryptedChArray = str.map(char => {
         var rotation = 0;
    
         if(/[A-M]/g.test(char)){
           rotation = 13;
         }
         else if(/[N-Z]/g.test(char)) {
           rotation = -13;
         }
    
         return char.charCodeAt(0) + rotation;
       });
    
       return String.fromCharCode.apply(String, encryptedChArray);
    }
    
    console.log(rot13("SERR PBQR PNZC"));

    【讨论】:

      【解决方案2】:

      您可以将字符串拆分为字符数组,然后对其进行映射,执行转换,最后将转换后的字符数组连接回字符串。

      function rot13(str) {
      
          // get the char code for the character
          const charCode = str.charCodeAt(0);
          
          if(/[A-M]/g.test(str)){
              return String.fromCharCode(charCode + 13);
          }
          else if(/[N-Z]/g.test(str)){
              return String.fromCharCode(charCode - 13);
          }
          else {
              return String.fromCharCode(charCode);
          }
      }
      
      // first split the string into an array of single characters
      const newString = "SERR PBQR PNZC".split("").map(rot13).join('');
      
      console.log(newString);

      【讨论】:

        【解决方案3】:

        如果您想非常紧凑地执行此操作,可以执行以下操作:

        const A = 'A'.charCodeAt(0)
        const M = 'M'.charCodeAt(0)
        const N = 'N'.charCodeAt(0)
        const Z = 'Z'.charCodeAt(0)
        function rot13(str) {
           var chArray = [];
           return String.fromCharCode(...(
             str.split('')
               .map(c => c.charCodeAt(0))
               .map(c =>
                 (A <= c && c <= M) ? c + 13 :
                 (N <= c && c <= Z) ? c - 13 :
                 c
               )
           ))
        }
        
        console.log(rot13("SERR PBQR PNZC"))

        【讨论】:

        • 这有点聪明,但我认为代码在做什么(用于维护)不太清楚,更重要的是对于较大的字符串来说性能要低得多(因为你正在迭代字符集一次可以做两次)
        【解决方案4】:

        另一种选择是使用 array.map here.

        映射方法接受一个回调,该回调将数组中的每个元素作为参数。

        例子:

        var arr = [1,2,3,4,5];
        arr.map(someFunc);
        
        var someFunc = function(currentItem){
             console.log(currentItem);
             //This will output 1
             //2
             //...
        }
        

        因此,您可以在传递给 map 的 someFunc 中定义密码转换。

        假设你想对下面的字符串进行编码

        var secretMessage = "hello"
        msgArray = secretMessage.split("");
        
        msgArray.map(cypher);
        
        var cypher = function(i){ 
             ///doStuff
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-04-26
          • 2014-03-07
          • 2020-05-31
          • 2014-02-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多