Javascript反向字母

时间:2019-01-02 11:40:50

标签: javascript replace alphabet

所以最近我一直在弄乱.replace()函数,并想使它在用户输入时反转。 (又名a-> z,A-> Z,b-> y,B-> Y ...)

我正在使用函数堆栈,所以我只为每个字母添加了.replace()。replace()...,但是当然不起作用,因为每当它到达n时,它将开始反转所有进步,我最终得到了不准确的翻译。 我知道如何解决此问题,因为据我所知,JS没有像Python这样的.reverse()函数?

如果您需要它,这是我的代码

//replacing letters
lettertext = ttext.replace("a", "z")
.replace("A", "Z")
.replace("b", "y")
.replace("B", "y")
.replace("c", "x")
.replace("C", "X")
.replace("d", "w")
.replace("D", "W")
.replace("e", "v")
.replace("E", "V")
.replace("f", "u")
.replace("F", "U")
.replace("g", "t")
.replace("G", "T")
.replace("h", "s")
.replace("H", "S")
.replace("i", "r")
.replace("I", "R")
.replace("j", "q")
.replace("J", "Q")
.replace("k", "p")
.replace("K", "P")
.replace("l", "o")
.replace("L", "O")
.replace("m", "n")
.replace("M", "N")
.replace("n", "m")
.replace("N", "M")
.replace("o", "l")
.replace("O", "L")
.replace("p", "k")
.replace("P", "K")
.replace("q", "j")
.replace("Q", "J")
.replace("r", "i")
.replace("R", "I")
.replace("s", "h")
.replace("S", "H")
.replace("t", "g")
.replace("T", "G")
.replace("u", "f")
.replace("U", "F")
.replace("v", "e")
.replace("V", "E")
.replace("w", "d")
.replace("W", "D")
.replace("x", "c")
.replace("X", "C")
.replace("y", "b")
.replace("Y", "B")
.replace("z", "a")
.replace("Z", "A")
.replace("ä", "ß")
.replace("Ä", "ẞ")
.replace("ö", "ü")
.replace("Ö", "Ü")
.replace("ü", "ö")
.replace("Ü", "Ö")
.replace("ß", "ä")
.replace("ẞ", "Ä")

8 个答案:

答案 0 :(得分:3)

只需创建一个由a - z中的字符串字符组成的数组,以及另一个由您提到的所有8 umlaut个字符组成的数组。

您现在可以简单地创建一个可重复使用的函数,reverseChar(),该函数接受字符作为参数。

然后该函数可以使用基本的正则表达式测试器检查输入的字符是字母还是变音符。

然后该函数尝试将输入的字符与相应数组中的字符串字符进行匹配,如果匹配,则从相反的数组中返回相同的索引字符。


尝试输入以下代码段中的a-zA-Z或上面提到的变音符之一的任何字符,以了解其工作原理:

var alpha = ["a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"];
var umlauts = ["ä","Ä","ö","Ö","ü","Ü","ß","ẞ"]

var val = "";

var result = document.getElementById("result");

function reverseChar(x) {
    
    if (/^[a-zA-Z]+$/.test(x)) {
      for (i = 0; i < 26; i++) {
          if (x.toLowerCase() == alpha[i]) {
              if (x == x.toUpperCase()) {
                val = ((alpha.reverse())[i]).toUpperCase();
              } else {
                val = (alpha.reverse())[i];
              }
          }
      }
	  result.innerHTML = `The reversed character for <strong>${x}</strong> is <strong>${val}</strong>`;
    } else {
        for (i = 0; i < umlauts.length; i++) {
        	if (x == umlauts[i]) {
            val = (umlauts.reverse())[i];
          }
        }
        result.innerHTML = `The reversed character for <strong>${x}</strong> is <strong>${val}</strong>`;
    }
}

// JavaScript below is for the HTML Example

var btn = document.getElementById("btn");

function checkChar(){
    var char = document.getElementById("char");
    var input = char.value;
    reverseChar(input);
}

btn.addEventListener("click", checkChar);
<input id="char" type="text" maxlength="1" />
<button type="button" id="btn">Check reversed character</button>
<p id="result"></p>

答案 1 :(得分:2)

您可以为哈希表获取哈希表,并映射新字符或原始字符(如果哈希表中不可用)。

function replace(string) {
    var code = { "a": "z", "A": "Z", "b": "y", "B": "y", "c": "x", "C": "X", "d": "w", "D": "W", "e": "v", "E": "V", "f": "u", "F": "U", "g": "t", "G": "T", "h": "s", "H": "S", "i": "r", "I": "R", "j": "q", "J": "Q", "k": "p", "K": "P", "l": "o", "L": "O", "m": "n", "M": "N", "n": "m", "N": "M", "o": "l", "O": "L", "p": "k", "P": "K", "q": "j", "Q": "J", "r": "i", "R": "I", "s": "h", "S": "H", "t": "g", "T": "G", "u": "f", "U": "F", "v": "e", "V": "E", "w": "d", "W": "D", "x": "c", "X": "C", "y": "b", "Y": "B", "z": "a", "Z": "A", "ä": "ß", "Ä": "ẞ", "ö": "ü", "Ö": "Ü", "ü": "ö", "Ü": "Ö", "ß": "ä", "ẞ": "Ä" };
    return Array.from(string, c => code[c] || c).join('');
}

console.log(replace('Übermut2019')); // 'Öyvinfg2019'
console.log(replace('Öyvinfg2019')); // 'Übermut2019'

答案 2 :(得分:2)

创建一个对象,其中key将是字符串的字母,其值将是您要替换的字符。

获取输入值后,将字符串拆分并创建一个数组,并使用map,并在其回调函数中检查字符的大小写。

如果是小写字母,则直接检索该值;如果是大写字母,则将其转换为小写字母,以从字典对象中获取该值,然后在返回之前将其转换回大写字母。

使用join创建最终字符串

let rvObj = {
  a: 'z',
  b: 'y'
}

function reverse() {
  var b = document.getElementById("text")
    .value //get value of input
    .trim() // remove whitespace
    .split("") // create an array
    .map(function(a) { //map will return new array
      return a === a.toLowerCase() ? rvObj[a] : rvObj[a.toLowerCase()].toUpperCase();
    }).join(""); // create a string from the array
  console.log(b);
};
<input type="text" id='text'>
<button type='button' onclick='reverse()'>Reverse</button>

答案 3 :(得分:2)

在这种情况下,替换将不起作用,因为-如您已经注意到的-它将无法跟踪先前的替换操作已替换了哪些字母。因此,一系列替换操作,例如

//...
.replace("M", "N")
//...
.replace("N", "M")
//...

只会撤消自身(如果在此期间未替换子字符串"N")。

不过,您可以将字符串作为数组映射,然后对字符进行ASCII / UTF8编码以颠倒字母顺序。

const s = "AzByCx";

const f = (string) => Array.from(string)
  .map(c => {
      const code = c.charCodeAt(0);

      // Leave characters `c` outside the character set [a-zA-Z] unchanged.
      if (code < 0x41 || (code > 0x5A && code < 0x61) || code > 0x7A) { 
          return c;
      }
      
      // Compute offset to last character in the set [a-z] (ASCII/UTF8: 0x41-0x5A) respectively [A-Z] (ASCII/UTF8: 0x61-0x7A)
      let offset;
      let base;
      if (code <= 0x5A) {
          offset = 0x5A - code;
          base = 0x41;
      } else {
         offset = 0x7A - code;
         base = 0x61;
      }

      // Compute new character encoding and convert back to string.
      return String.fromCharCode(base + offset)
  })
  .join('');

console.log(`${s} ~> ${f(s)}`);
console.log(`${f(s)} ~> ${f(f(s))}`);

您可以使用相同的方法将其扩展为包括Umlauts。

答案 4 :(得分:1)

每个字母只需切换一次。您可以使用以下模式:

a='abcxyz'.replace(/./g,function(letter){
switch (letter) {
        case 'a':
            return 'z'
    default:
        return letter
}
})

我们在做什么,它将替换a到z。但是它不会再次取代它。 每个字母只被替换一次。

我用于替换的函数在字符串中的每个字母上执行。

答案 5 :(得分:1)

在使用所有替换语句的情况下,可以使用char代码来自动查找匹配对:

a='abcxyzABC'.replace(/./g,function(letter){
if (letter>='a' && letter<='z') {
    return String.fromCharCode( 'z'.charCodeAt(0) - letter.charCodeAt(0) + 'a'.charCodeAt(0)  )
}
if (letter>='A' && letter<='Z') {
    return String.fromCharCode( 'Z'.charCodeAt(0) - letter.charCodeAt(0) + 'A'.charCodeAt(0)  )
}
})

//ouptut: 'zyxcbaZYX"

答案 6 :(得分:1)

最简单的方法是使用内置函数,拆分,反向和联接

function reverseString(str) {

    // Step 1. Use the split() method to return a new array ["h", "e", "l", "l", "o"]
    var splitString = str.split(""); 


    // Step 2. Use the reverse() method to reverse the new created array
    // will look like ["o", "l", "l", "e", "h"]
    var reverseArray = splitString.reverse(); 

    // Step 3. Use the join() method to join all elements of the array into a string
    // will look like "olleh"
    var joinArray = reverseArray.join(""); 


    //Step 4. Return the reversed string
    return joinArray; // "olleh"
}

reverseString("hello");

答案 7 :(得分:1)

这里已经有很多答案,但是看起来很有趣,所以这里是我的解决方案说明:

  1. 将字母分为第一部分和第二部分
  2. 颠倒第二部分
  3. 检查每个字母所在的部分,并用相同的索引替换但另一部分相反的字母
  4. 将每个字母添加到解决方案中

编辑:如果您想完成句子,还请检查空格:)

var alphabet = 'abcdefghijklmnopqrstuvwxyz';
var firstpart = alphabet.substring(0,13).split('');
var secondpart = alphabet.substring(13).split('').reverse();
var button = document.getElementById("button");
var solution = '';

// Click function
button.onclick = function() {
var b = document.getElementById("text").value.split('');
// Loop every letter of input
for (var i = 0 ; i < b.length; i++) {
 if (firstpart.indexOf(b[i]) !== -1) {
   solution += secondpart[firstpart.indexOf(b[i])];
 } else {
   solution += firstpart[secondpart.indexOf(b[i])];
  }
}
console.log(solution);
// Reset solution
solution = '';
}
<input type="text" id='text'>
<button type='button'id='button'>Reverse</button>