Javascript 替换字符串时出错

Javascript error when replacing strings

我正在尝试 Javascript codewars 关于替换字符串的挑战。

说明是:您的任务:

你必须创建一个函数 GrεεκL33t 其中
将字符串作为输入,并以 returns 的形式 (L33T+Grεεκ) 案例。 注意:未转换的字母 (L33T+Grεεκ) 返回小写字母。

(L33T+Grεεκ)Case:

A=α (Alpha)      B=β (Beta)      D=δ (Delta)
E=ε (Epsilon)    I=ι (Iota)      K=κ (Kappa)
N=η (Eta)        O=θ (Theta)     P=ρ (Rho)
R=π (Pi)         T=τ (Tau)       U=μ (Mu)      
V=υ (Upsilon)    W=ω (Omega)     X=χ (Chi)
Y=γ (Gamma)
Examples:

GrεεκL33t("CodeWars") = "cθδεωαπs"
GrεεκL33t("Kata") = "κατα"

我认为问题在于,当我复制网页上提供的希腊字符时,codewars 无法识别它们,它的计算结果为:

Expected: cθδεωαπs, instead got: cundefinedundefinedundefinedundefinedundefinedundefineds

我的解决方案如下,有人知道如何让它工作吗?

function GrεεκL33t(str){
   var mapObj = {
      A:"α",  B:"β", D:"δ",E:"ε", I:"ι", K:"κ", 
      N:"η", O:"θ", P:"ρ", R:"π", T:'τ', U:'μ', 
      V:'υ', W:'ω', X:'χ', Y:'γ' 
   };

   str = str.replace(/A|B|D|E|I|K|N|O|P|R|T|U|V|W|X|Y/gi, function(matched){
   return mapObj[matched];
   });

   return str;
}

既然已经有了钥匙,为什么还要进行所有复杂的替换和匹配操作。 做这样的事情:

function Gr(str) {
    var mapObj = {
        A: "α",
        B: "β",
        D: "δ",
        E: "ε",
        I: "ι",
        K: "κ",
        N: "η",
        O: "θ",
        P: "ρ",
        R: "π",
        T: 'τ',
        U: 'μ',
        V: 'υ',
        W: 'ω',
        X: 'χ',
        Y: 'γ'
    };

    var rebuildString="";

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

        rebuildString += mapObj[str.charAt(i)];
        console.log(rebuildString);

    }

    return rebuildString;

}
Gr("ABD");

编辑

这应该可以正常工作。我没有时间包括小写情况,但你会明白的。

http://jsfiddle.net/8pwhdpm2/

您的正则表达式匹配小写字母,尽管它不区分大小写。要修复它,请使用 str.toUpperCase():

str = str.replace(/A|B|D|E|I|K|N|O|P|R|T|U|V|W|X|Y/gi, function(matched){
    return mapObj[matched.toUpperCase()];
});

https://jsfiddle.net/tdvuL4er/

您当前的解决方案只需进行一些调整即可使用(并不是说没有更好的解决方案):

function GrεεκL33t(str){
   var mapObj = {
      a:"α",  b:"β", d:"δ",e:"ε", i:"ι", k:"κ", 
      n:"η", o:"θ", p:"ρ", r:"π", t:'τ', u:'μ', 
      v:'υ', w:'ω', x:'χ', y:'γ' 
   };

   str = str.toLowerCase().replace(/A|B|D|E|I|K|N|O|P|R|T|U|V|W|X|Y/gi, function(matched){ 
   return mapObj[matched];
   });

   return str;
}

alert(GrεεκL33t("Codewars"));

你有两个问题。首先,您忽略了不匹配字符以小写形式返回的要求。通过使用 toLowerCase 我们解决了这个问题。第二个问题是你的 mapObj 的键都是大写的,但在 Codewars 的情况下你传递的是小写字符。 Javascript 区分大小写。 mapObj["A"]mapObj["a"] 不同。由于我们只是将整个字符串小写,我只是将 mapObj 中的键也更改为小写(或者,如果你 真的,真的 想要,你可以 matched.toUpperCase()保持按键大写)。