你能解释一下这段代码吗? (。更换)

时间:2018-04-19 11:51:03

标签: javascript arrays replace

我有一个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;
}

为清晰起见编辑: 我得到了代码正在做的事情,它比我没有得到的更多。进入函数的各种参数是什么?这意味着我能够插入密钥吗?

1 个答案:

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