改进 javascript 中的替换功能

improve replace function in javascript

我正在尝试以更简洁的方式执行此功能,你能帮帮我吗?

  function removeAccents(text) {

        var text = text.replace(/á/g, "a").replace(/é/g, "e").replace(/í/g, "i").replace(/ó/g, "o").replace(/ú/g, "u");

        return cadenaTexto;

    }

你的代码对我来说已经很干净了,也许你可以将替换放在单独的行中,但它很容易理解。

我不确定下面的代码是否更清晰,但我只是利用了如何将 replacerFunction 传递给 String.prototype.replace

这样您就可以将要替换的字符保存到一个单独的对象中,然后将它们传入。

function removeAccents(text) {
  const replacements = { á: "a", é: "e", í: "i", ó: "o", ú: "u" };
  return text.replace(/[áéíóú]/g, match => replacements[match]);
}

console.log(removeAccents("áéíóú"));

编辑:@Ryan White 的解决方案,使用匹配回调是迄今为止最快的解决方案,从较短字符串的 20% 到较长字符串的 100% 以上,比以下两种解决方案都快,因为它可以避免循环:

const replacements = { à: 'a', è: 'e', ì: 'i', ò: 'o', ù: 'u' };

function removeAccents3(text) {
  const accs = Object.keys(replacements).join('')
  return text.replace(
    new RegExp(`[${accs}]`, 'gi'),
    (match) => replacements[match]
  );
}

console.log(removeAccents3('àèbgòè+àòètrysàùì')); //aebgoe+aoetrysaui
// Performance : 69059.40 ops/s

我提出了几种方法,它们具有相似的性能,虽然通过 RegExp 进行替换的性能更高,但对于较短的字符串您不会注意到,但对于较长的字符串您有 +20% 的性能。

const accents = [
  {
    val: 'à',
    repl: 'a',
  },
  {
    val: 'è',
    repl: 'e',
  },
  {
    val: 'ì',
    repl: 'i',
  },
  {
    val: 'ò',
    repl: 'o',
  },
  {
    val: 'ù',
    repl: 'u',
  },
];

const removeAccents = (text) => {
  for (const a of accents) text = text.replace(new RegExp(a.val, 'ig'), a.repl);
  return text;
};

console.log("First test:", removeAccents('àèbgòè+àòètrysàùì')); //aebgoe+aoetrysaui
// Performance : 46168.04 ops/s

// 2

const accents2 = {
  à: 'a',
  è: 'e',
  ì: 'i',
  ò: 'o',
  ù: 'u',
};
const removeAccents2 = (text) => text.split("").map(c => accents2[c] ? accents2[c] : c).join("")

console.log("Second test:", removeAccents2('àèbgòè+àòètrysàùì')); //aebgoe+aoetrysaui
// Performance : 45910.35 ops/s