Perceba que a lista de caracteres válidos é bem restrita (somente letras de “A” a “Z” - maiúsculas ou minúsculas, e sem acento - ou dígitos), enquanto que a lista de caracteres inválidos é imensa (qualquer coisa que não seja letra ou número, ou seja, pode ser espaço, sinal de pontuação, letras de outros alfabetos, emojis, etc).
Sendo assim, é mais fácil fazer um if
que verifique se o caractere é válido, em vez de ficar comparando com cada um que for inválido - ou seja, em vez de ver se é diferente de $
, ou de /
, etc, é mais simples ver se é letra ou dígito:
function extractPassword(caracteres) {
var validos = [];
for (var i = 0; i < caracteres.length; i++) {
var c = caracteres[i];
// se é letra ou dígito
if (('a' <= c && c <= 'z') || ('A' <= c && c <= 'Z') || ('0' <= c && c <= '9')) {
validos.push(c);
}
}
return validos.join('');
}
var randomLetters =['y', 'º', 'B', 'Y', '$', 'º', 'M', '~', 'A', 'z', '/', 'M', '4'];
var senha = extractPassword(randomLetters);
console.log(senha); // yBYMAzM4
E no final usei join
para juntar os elementos do array validos
em uma única string, já que o exercício pede que se retorne uma string.
Nas versões mais novas da linguagem você pode usar o for..of
para iterar pelo array:
function extractPassword(caracteres) {
var validos = [];
for (var c of caracteres) {
if (('a' <= c && c <= 'z') || ('A' <= c && c <= 'Z') || ('0' <= c && c <= '9')) {
validos.push(c);
}
}
return validos.join('');
}
Esse é o jeito que considero mais simples (um loop “tradicional”, sem inventar muito). Mas claro que a “modinha” atual é ser “funcional”, então provavelmente alguém vai sugerir usar filter
ou forEach
:
function extractPassword(caracteres) {
var validos = [];
caracteres.forEach(c => {
if (('a' <= c && c <= 'z') || ('A' <= c && c <= 'Z') || ('0' <= c && c <= '9')) {
validos.push(c);
}
});
return validos.join('');
}
// ou
function extractPassword(caracteres) {
return caracteres
.filter(c => ('a' <= c && c <= 'z') || ('A' <= c && c <= 'Z') || ('0' <= c && c <= '9'))
.join('');
}
Que também funcionam, mas eu sinceramente acho um exagero para um exercício tão simples. Apesar de serem “mais curtos”, ambos têm o overhead de se fazer várias chamadas do callback (o parâmetro que eles recebem é uma função que é chamada para cada elemento, e chamadas de função têm o seu custo). Claro que para poucos arrays pequenos não fará diferença significativa, mas enfim, a menos que haja uma boa justificativa, eu ainda prefiro o loop simples…