Crie uma função que pegue num array (incluindo caracteres inválidos) e returns com apenas caracteress válidos

Create a function named extractPassword which takes an array of characters (which includes some trash characters) and returns a string with only valid characters (a - z, A - Z, 0 - 9).

Eu fui parva e fiz isto:

randomLetters =[‘y’, ‘º’, ‘B’, ‘Y’, ‘$’, ‘º’, ‘M’];
newPass = [];

for (var i = 0; i < randomLetters.length; i++) {
if (randomLetters[i] !== ‘º’ && randomLetters !== ‘$’) {
newPass.push(randomLetters[i]);
console.log(newPass);
}
}

E claro que dá error pois não criei uma função, o que é todo o objective. Podem-me ajudar?
Obrigada!

var passWord = [’~’, ‘A’, ‘z’, ‘/’, ‘M’, ‘4’];
var newPass = [];
var extractPassword = function(array){
for (i = 0; i < passWord.length; i++){
if (passWord[i] !== ‘~’ && passWord !== ‘/’){
newPass.push(passWord[i]);
console.log(newPass);
}
}
};

Também tentei isto e com o return em vez de console.log, diz-me que “>>>>Code is incorrect
Your function is not returning the correct value” - Código incorrecto, a tua função não está a fazer return com o valor correto.

Eu quero mesmo perceber isto

Uma forma de resolver isso é com RegEx, exemplo:

E aparentemente é o mesmo exercício que o seu.

Não sei se eles actualizaram o exercicio mas não deixa, diz

“>>>>Code is incorrect
RegEx’s are cool, but that is not the type of solution we are looking for
passWord is not defined”

Já tinha visto esse post, era uma solução perfeita mas não é isso que eles querem.

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…

2 curtidas

Concordo contigo, eles estão a dificultar algo que devia ser bem mais simples e funcional, mas obrigada, aprendi imenso com a tua resposta!