Não tinha pensado desse modo, ótima sua implementação! Eu reescrevi ela de uma forma mais concisa, mas acho que não perderia muita coisa de performance:
const isLetter = char => /[a-z]/i.test(char)
const isNumber = char => /[0-9]/.test(char)
const isSpecial = char => /[!@#$%]/.test(char)
function filterChars(text, filters) {
const result = text.split('').filter(char => {
for (const filter of filters) {
if (filter(char)) return true
}
return false
})
return result.join('')
}
const alphabet = 'abcde123456!@#$%'
console.log(filterChars(alphabet, [isLetter, isNumber])) // abcde123456
console.log(filterChars(alphabet, [isLetter, isSpecial])) // abcde!@#$%
console.log(filterChars(alphabet, [isNumber, isSpecial])) // 123456!@#$%
tipado:
type FilterFn = (char: string) => boolean
const isLetter: FilterFn = (char: string) => /[a-z]/i.test(char)
const isNumber: FilterFn = (char: string) => /[0-9]/.test(char)
const isSpecial: FilterFn = (char: string) => /[!@#$%]/.test(char)
function filterChars(text: string, filters: FilterFn[]) {
const result = text.split('').filter(char => {
for (const filter of filters) {
if (filter(char)) return true
}
return false
})
return result.join('')
}
O que você acha?
Além disso, o nome não está bom. Eu entendi que se letter for true, vc não quer remover as letras, e sim mantê-las. Por isso o remove no início dos nomes dos filtros não me parece uma boa.
Aqui foi erro meu na hora de digitar, o certo seria:
.filter(removeLetters) // Filtro deve ser aplicado apenas se `options.letters` for `false`