改进 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
我正在尝试以更简洁的方式执行此功能,你能帮帮我吗?
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