我有一个Kata,希望我转换为leetSpeak。我能够谷歌一个类似的足够的解决方案,使其工作。我是一个初学者,并希望有人能够向我解释这段代码是如何工作的,以便将来可以恭维它。我理解.replace和搜索值,但不是新值。 这是代码:
function toLeetSpeak(str) {
var leet = str.replace(/[A-Z]/g, function(str, p1, p2, offset, leet) {
var translate_table = {
A : '@',
B : '8',
C : '(',
D : 'D',
E : '3',
F : 'F',
G : '6',
H : '#',
I : '!',
J : 'J',
K : 'K',
L : '1',
M : 'M',
N : 'N',
O : '0',
P : 'P',
Q : 'Q',
R : 'R',
S : '$',
T : '7',
U : 'U',
V : 'V',
W : 'W',
X : 'X',
Y : 'Y',
Z : '2'
};
return translate_table[str];
});
return leet;
}
为清晰起见编辑: 我得到了代码正在做的事情,它比我没有得到的更多。进入函数的各种参数是什么?这意味着我能够插入密钥吗?
答案 0 :(得分:2)
最好这样写。
你基本上有一个替换字典,并且对于每个匹配,你用匹配的字符替换匹配的子字符串。
const LEET_SPEAK_DICT = {
A : '@', B : '8', C : '(', D : 'D',
E : '3', F : 'F', G : '6', H : '#',
I : '!', J : 'J', K : 'K', L : '1',
M : 'M', N : 'N', O : '0', P : 'P',
Q : 'Q', R : 'R', S : '$', T : '7',
U : 'U', V : 'V', W : 'W', X : 'X',
Y : 'Y', Z : '2'
};
function toLeetSpeak(str) {
return translate(str, LEET_SPEAK_DICT);
}
function translate(phrase, dictionary) {
return phrase.replace(/[A-Z]/g, function(str, p1, p2, offset, original) {
return dictionary[str];
});
}
console.log(toLeetSpeak('Hello World'.toUpperCase()));
.as-console-wrapper { top: 0; max-height: 100% !important; }
您也可以将其写为关键缩减器。
String.prototype.replaceAll = function(search, replacement) {
return this.replace(new RegExp(search, 'g'), replacement);
};
const LEET_SPEAK_DICT = {
A : '@', B : '8', C : '(', D : 'D',
E : '3', F : 'F', G : '6', H : '#',
I : '!', J : 'J', K : 'K', L : '1',
M : 'M', N : 'N', O : '0', P : 'P',
Q : 'Q', R : 'R', S : '$', T : '7',
U : 'U', V : 'V', W : 'W', X : 'X',
Y : 'Y', Z : '2'
};
function toLeetSpeak(str) {
return translate(str, LEET_SPEAK_DICT);
}
function translate(str, dict) {
return Object.keys(dict).reduce((s, k) => s.replaceAll(k, dict[k]), str);
}
console.log(toLeetSpeak('Hello World'.toUpperCase()));
.as-console-wrapper { top: 0; max-height: 100% !important; }