替换字符串时出现Javascript错误

时间:2015-08-11 18:37:07

标签: javascript string replace match

我正在尝试从代码大战中挑选有关替换字符串的Javascript挑战。

说明如下:您的任务:

你必须创建一个功能GrεεκL33t 将字符串作为输入并以形式返回 (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") = "κατα"

我认为问题在于,当我复制网页上提供的希腊字符时,代码报告无法识别它们,它的评估结果为:

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

3 个答案:

答案 0 :(得分:1)

您目前的解决方案可以通过几个调整来实现(不是说建议没有更好的解决方案):

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()大写)。

答案 1 :(得分:0)

为什么当你已经拥有密钥时,所有复杂的替换和匹配的东西。 做这样的事情:

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/

答案 2 :(得分:0)

你的正则表达式匹配小写字母,即使它不区分大小写。要解决此问题,请使用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/