2016-09-30 74 views
2

我需要刷新我的JavaScript,因为它是我最弱的语言,所以我想“嘿,让一个简单的'翻译'程序来测试我的技能。那么我能够通过一种方式进行翻译(我还没有对人们输入的东西进行非翻译),但无论如何,它的作用方式是由交换机内部的一系列情况。我想知道如果有反正我可以简化代码而不是有一百万个开关情况。谢谢你是我的代码。简化长切换语句

function main() { 
      var get = prompt("Enter what you would like to encode!","At the current time decoding is still a WIP").toLowerCase(); 
      var ina = [...get]; 
      for(i = 0; i < ina.length; i++) { 
       switch(ina[i]) { 
       case "a": 
        ina[i] = "z"; 
        break; 
       case "b": 
        ina[i] = "y"; 
        break; 
       case "c": 
        ina[i] = "x"; 
        break; 
       case "d": 
        ina[i] = "w"; 
        break; 
       case "e": 
        ina[i] = "v"; 
        break; 
       case "f": 
        ina[i] = "u"; 
        break; 
       case "g": 
        ina[i] = "t"; 
        break; 
       case "h": 
        ina[i] = "s"; 
        break; 
       case "i": 
        ina[i] = "r"; 
        break; 
       case "j": 
        ina[i] = "q"; 
        break; 
       case "k": 
        ina[i] = "p"; 
        break; 
       case "l": 
        ina[i] = "o"; 
        break; 
       case "m": 
        ina[i] = "n"; 
        break; 
       case "n": 
        ina[i] = "m"; 
        break; 
       case "o": 
        ina[i] = "l"; 
        break; 
       case "p": 
        ina[i] = "k"; 
        break; 
       case "q": 
        ina[i] = "j"; 
        break; 
       case "r": 
        ina[i] = "i"; 
        break; 
       case "s": 
        ina[i] = "h"; 
        break; 
       case "t": 
        ina[i] = "g"; 
        break; 
       case "u": 
        ina[i] = "f"; 
        break; 
       case "v": 
        ina[i] = "e"; 
        break; 
       case "w": 
        ina[i] = "d"; 
        break; 
       case "x": 
        ina[i] = "c"; 
        break; 
       case "y": 
        ina[i] = "b"; 
        break; 
       case "z": 
        ina[i] = "a"; 
        break; 
       default: 
        ina[i] = ina[i] 
        }; 
       }; 
       var outa = ina.join(""); 
       document.getElementById("output").innerHTML = outa; 

      };  
+0

这就要看,有没有consistenc ÿ?例如,你似乎正在向后翻译相同的字母,这可能会更容易处理一个字符数组,并使用长度等,但对于其他模式,可能无法正常工作,所以你只想为这个模式提供一些东西,或者一些更简单的方法来编写一个通用的*(实际上没有)*。 – adeneo

+1

如果您有需要改进的工作代码,也可以在http://codereview.stackexchange.com上询问。他们将帮助您改进代码的各个方面。 – tsleyson

回答

3

你可以使用一个对象,具有属性,如

{ 
    a: 'z', 
    b: 'y', 
    c: 'x', 
    // ... 
    z: 'a' 
} 

用法与ina[i]默认值。

ina[i] = object[ina[i]] || ina[i]; 
1

您可以使用几个字符串变量来映射字母。

function translateLetter(input) { 
    const untranslated = "abcdefghijklmnopqrstuvwxyz"; 
    const translated = "zyxwvutsrqponmlkjihgfedcba"; 

    var i = untranslated.indexOf(input); 
    return translated[i]; 
} 
+0

你想确保你处理的情况下,输入不是'未翻译';原样,你会为所有这些返回undefined。这也涉及每个角色的线性扫描;无可否认,它可能会像'memchr'调用那样快速地进行JIT,但是您可以直接在没有扫描的情况下直接计算索引。 – ShadowRanger

+0

计算诉扫描 - 性能与可扩展性的经典案例。至少我没有要求服务。 –

1

switch你使用具有可直接(我相信大多数现代JS解释应该JIT远离实际的方法调用,如果这是一个热循环来实现,而不需要在switch在通过简单的数学逻辑所有,因此成本也应该是微不足道的):

var get = prompt("Enter what you would like to encode!","At the current time decoding is still a WIP").toLowerCase(); 
var ina = [...get]; 
for(i = 0; i < get.length; i++) { 
    var code = get.charCodeAt(i); 
    if (97 <= code && code <= 122) { // 'a' and 'z' ordinal values 
     // Invert lowercase letters with simple math and convert back to character 
     ina[i] = String.fromCharCode((122 + 97) - code); 
    } 
    // No need to handle non-lowercase/non-ASCII since ina initialized to match get 
} 
0

只是做数学题的ASCII字符代码:

function main() { 
    var get = prompt("Enter what you would like to encode!","At the current time decoding is still a WIP").toLowerCase(); 
    var ina = [...get]; 

    for (i = 0; i < get.length; i++) { 
     var charNum = get.charCodeAt(i) - 96; 

     if (charNum > 0 && charNum < 27) { 
      ina[i] = String.fromCharCode((27 - charNum) + 96); 
     } 
    }; 

    var outa = ina.join(""); 
    document.getElementById("output").innerHTML = outa; 
};