Я не знаю, насколько вы заботитесь о производительности, но использование регулярных выражений не очень эффективно.Простой тест для довольно длинной строки показывает, что использование функции фильтра в среднем примерно в 3 раза быстрее, что может иметь большое значение при выполнении на очень длинных строках или на многих, многих коротких.
function test(func, n){
var text = "";
for(var i = 0; i < n; ++i){
text += "a";
}
var start = new Date().getTime();
func(text);
var end = new Date().getTime();
var time = (end-start) / 1000.0;
console.log(func.name, " took ", time, " seconds")
return time;
}
function encryptREGEX(text) {
let removedText = '';
const replacedText1 = text.replace(/(.)(.)?/g, (_, firstChar, secondChar) => {
// in case the match was at the end of the string,
// and the string has an odd number of characters:
if (!secondChar) secondChar = '';
// remove the firstChar from the string, while adding it to removedText:
removedText += firstChar;
return secondChar;
});
return replacedText1 + removedText;
}
function encrypt(text) {
text = text.split("");
var removed = "";
var encrypted = text.filter((letter, index) => {
if(index % 2 == 0){
removed += letter;
return false;
}
return true
}).join("")
return encrypted + removed
}
var timeREGEX = test(encryptREGEX, 10000000);
var timeFilter = test(encrypt, 10000000);
console.log("Using filter is faster ", timeREGEX/timeFilter, " times")
![filter vs regex - performance test result](https://i.stack.imgur.com/qv7js.png)
Использование массива для хранения удаленных букв и последующего их объединения гораздо эффективнее,чем использование строки и объединение букв к ней.
Я изменил массив на строку в решении фильтра, чтобы сделать его таким же, как в решении регулярных выражений, чтобы они были более сопоставимыми.