如何使用.join .slice或.push使此加密器/解密器工作?

时间:2019-04-25 01:02:16

标签: javascript

我正在尝试制作一个加密器/解密器(极其简单),我需要将所有“ o”换成“!”,“ e”换成“#”,“ t”换成“%”和“ n”代表“&”。

首先,您应该编写文本,按一个按钮并对其进行加密,然后按一个按钮将其解密为原始输入,但是我似乎无法使其正常工作。 (我对JS非常陌生)。

我目前正在做一个for循环,但是如果有更好的建议,我会尽力理解。

    function fResult() {

        var deKey = [
            "o",
            "e",
            "t",
            "n"
        ];

        var str = document.getElementById("text").value;

        var enKey = [
            "!",
            "#",
            "%",
            "&"
        ];

        var resultEn = fEncrypted(str, deKey, enKey);

        document.getElementById("writeText").innerHTML= resultEn;

    }

    function fEncrypted(str, deKey, enKey) {

        var resultKey = []
        str = str.split("", str.length);

        for (var i = 0; i < str.length; i++) {

            if (str[i] == "o") {

                str.slice(str[i]);
            }
            if (str[i] == "e") {

                resultKey.push(enKey[1]);
            }
            if (str[i] == "t") {

                resultKey.push(enKey[2]);
            }
            if (str[i] == "n") {

                resultKey.splice(1, 1, (enKey[3]));
            }

            else {
                resultKey.push(str[i]);
            }

我认为,由于我使用if str[i] == "letter",因此应该跳过对else的推送,但是它只是将预期的“加密字母”推送到原始字母的前面。

2 个答案:

答案 0 :(得分:0)

否则,el仅适用于最后一个if。要执行关于其他的询问,您需要使用else(如果除了第一个和最后一个块以外的所有块)。我很困惑,如果每个块本质上都应该做相同的事情,那么为什么每个块都不相同。

        if (str[i] == "o") {

            str.slice(str[i]);
        }
        else if (str[i] == "e") {

            resultKey.push(enKey[1]);
        }
        else if (str[i] == "t") {

            resultKey.push(enKey[2]);
        }
        else if (str[i] == "n") {

            resultKey.splice(1, 1, (enKey[3]));
        }
        else {
            resultKey.push(str[i]);
        }

还可以只使用replace()吗? It可以使用带有全局和不区分大小写选项的正则表达式来执行所需的操作。链接中有一个示例。

答案 1 :(得分:0)

您可以尝试类似的操作:

    function fEncrypted(str, deKey, enKey) {
      var newStr = str.split('');
      //run through every character in string
      for (var i = 0; i < newStr.length; i++) {
        //run for each character in the encryption values
        for (var j = 0; j < deKey.length; j++){
          if(newStr[i] == deKey[j]) {
            newStr[i] = enKey[j];
            break;
          }
        }
      }
      return newStr.join('');
    }

不过,我不认为这是最有效的方法。例如,对于要加密的大量密钥值,您可以使用哈希表,因此代码应如下所示:

    function fEncrypted(str, deKey, enKey) {
      var newStr = str.split('');

      //setup hash table
      hashtable = {}
      for (var i = 0; i < deKey.length; i++){
        hashtable[deKey[i]]=enKey[i];
      }

      //run through every character in string
      for (var i = 0; i < newStr.length; i++) {
        if ( hashtable[newStr[i]] != undefined ) {
          newStr[i] = hashtable[newStr[i]];
        }
      }
      return newStr.join('');
    }

由于您是Java语言的新手,所以我认为有必要指出for循环通常是通过map,reduce,filter或forEach进行的。我没有使用任何这些,因此您的代码将更加清晰。