2017-08-04 1 views
2

Es ist ein Caesar-Chiffre-Programm, ich habe diesen Code von mir selbst geschrieben und möchte diese for-Schleife in .map JavaScript integrierte Funktion konvertieren, habe ich so viele Male versucht aber kann nicht herausfinden.Caesar Cipher (Wie konvertiere ich für in .map)

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

Es gibt viele Fragen auf .map auf dieser Website, aber das ist für mich nicht funktioniert.

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");

Antwort

0

Wenn Sie diese sehr kompakt tun möchten, können Sie folgendes tun:

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"))

+0

Dies ist etwas klug, aber ich würde behaupten, es ist weniger klar, was der Code tut (für Wartung) und noch wichtiger ist viel weniger leistungsfähig für größere Zeichenfolge s (da du zweimal über den Zeichensatz iterierst) – Paul

0

Eine weitere Option array.map here.

Das Abbildungsverfahren in einem Callback nimmt zu verwenden wäre, und der Rückruf nimmt als Parameter der Elemente in der Anordnung jeweils.

Beispiel:

var arr = [1,2,3,4,5]; 
arr.map(someFunc); 

var someFunc = function(currentItem){ 
    console.log(currentItem); 
    //This will output 1 
    //2 
    //... 
} 

Daher können Sie Sie definieren Chiffre Transformation innerhalb des someFunc, die Sie zuordnen passieren.

Angenommen, Sie die folgende Zeichenfolge

var secretMessage = "hello" 
msgArray = secretMessage.split(""); 

msgArray.map(cypher); 

var cypher = function(i){ 
    ///doStuff 
} 
1

Below kodieren wollen, ist eine einfache Anpassung des Codes map (verwendet, um eine Variable rotation duplizierten Code zu vermeiden) zu verwenden:

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"));

1

Sie können die Zeichenfolge in ein Array von Zeichen aufteilen und dann o abbilden Vera, führen Sie die Transformationen durch, und fügen Sie am Ende das Array transformierter Zeichen wieder in eine Zeichenfolge ein.

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);

Verwandte Themen