功能优化,用非重音元音代替重音元音

时间:2018-05-25 16:00:12

标签: javascript regex algorithm optimization

我需要从数据库中检索名称,可以使用重音和非重音元音搜索这些名称,这两种方式都必须返回所有匹配的名称。我用来解决这个问题的方法是一个函数,用一个包含两个元音的字符串替换搜索到的名称中的元音,以便用正则表达式方法查找这两个选项。

如何优化此功能?

const replaceVowels = fullName => {
    const v = [
        { vocal: "a", replace: "[aá]" },
        { vocal: "e", replace: "[eé]" },
        { vocal: "i", replace: "[ií]" },
        { vocal: "o", replace: "[oó]" },
        { vocal: "u", replace: "[uú]" },
        { vocal: "á", replace: "[aá]" },
        { vocal: "é", replace: "[eé]" },
        { vocal: "í", replace: "[ií]" },
        { vocal: "ó", replace: "[oó]" },
        { vocal: "ú", replace: "[uú]" }
    ];
    for (let i = 0; i < v.length; i++) {
         fullName = fullName.replace(new RegExp(v[i].vocal, "gi"), v[i].replace);
    }
    return { $regex: fullName, $options: "i" };
};
replaceVowels("mayúsculas");
// returns "m[aá]y[uú]sc[uú]l[aá]s"

2 个答案:

答案 0 :(得分:1)

一个简单的(非常小的)速度优化就是将元音列表作为一个对象,然后只需经过fullName一次。作为奖励,代码现在按预期工作!

const replaceVowels = fullName => {
  const v = {
    "a": "[aá]",
    "e": "[eé]",
    "i": "[ií]",
    "o": "[oó]",
    "u": "[uú]",
    "á": "[aá]",
    "é": "[eé]",
    "í": "[ií]",
    "ó": "[oó]",
    "ú": "[uú]"
  };
  let output = "";
  for (let i = 0; i < fullName.length; i++) {
    if (v[fullName[i]]){
      output += v[fullName[i]];
    }
    else {
      output += fullName[i];
    }
  }
  return output;
};
replaceVowels("mayúsculas");
// returns "m[aá]y[uú]sc[uú]l[aá]s"

答案 1 :(得分:-1)

为了提高效率,为什么不在MongoDB中使用text index - 特别是因为他们已经拥有了你想要的行为?

然而,清除我给出的早期答案,你可以使功能更紧凑。

const replaceVowels = fullName => {
  // Patterns to match characters
  // ... that should then be replaced with the pattern
  const v = ["[aá]", "[eé]", "[ií]", "[oó]", "[uú]"];
  
  for (let i = 0; i < v.length; i++) {
    fullName = fullName.replace(new RegExp(v[i], "gi"), v[i]);
  }
  
  return {
    $regex: fullName,
    $options: "i"
  };
};

console.log(replaceVowels("mayúsculas"));