我正在尝试从代码大战中挑选有关替换字符串的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;
}
答案 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");
修改强>
这应该按预期工作。我没有时间包含小写情况,但你会弄清楚。
答案 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()];
});