我需要从数据库中检索名称,可以使用重音和非重音元音搜索这些名称,这两种方式都必须返回所有匹配的名称。我用来解决这个问题的方法是一个函数,用一个包含两个元音的字符串替换搜索到的名称中的元音,以便用正则表达式方法查找这两个选项。
如何优化此功能?
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"
答案 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"));