1
resposta

como resolver usando somente forEach e slice?

const alunos = ["Ana", "Marcos", "Maria", "Mauro"];
const medias = [7, 4.5, 4, 5.9];
let reprovados = [];

durante a essa bricadeira usei forEach e push, resolvendo até que bonitinho o proposto:

alunos.forEach((valorAtual, i) =>{
    if (medias[i] < 6) reprovados.push(valorAtual);
})

aí tentei resolver usando somente slice e forEach como sugerido na aula, mas o slice retorna um array, o que é estranho se pensar que vc está colocando um array dentro de um array, então fiz o seguinte:

reprovados = [];
j=0;
alunos.forEach((valorAtual, i) =>{
    
    let temp = '';
    if (medias[i] < 6) {
        
        temp = alunos.slice(i,i+1);
        reprovados[j] = temp[0];
        j++;
    }
    
})
console.log(reprovados);

achei minha solução com slice meio feia, tem alguma forma mais elegante de fazer isso sem usar outros metodos?

1 resposta

Olá Aaron, Veja bem, você tem razão, usar forEach e Slice para realizar essa operação realmente não me parece muito adequado. Entretanto, é sim possível.

'Array.forEach()' e 'Array.slice()': Opinião: Esta alternativa é provavelmente a menos eficiente possível, e usa o forEach para iterar através da Array 'alunos', aplicando slice para retirar um item de cada vez. Dentro do 'forEach' a função de callback recebe 3 parâmetros: 'value', 'index', e 'array' (que é uma referência ao array pelo qual estamos iterando). Dessa forma, aplicamos 'slice' para pegar o item no índice atual.

 alunos.forEach((v, i, a) => {
     if (medias[i] < 6) reprovados.push( a.slice(i, i+1)[0] );
 });

Se possível, optar por Array.filter() ou Array.map() trará melhor desempenho e legibilidade para o código:

let reprovados = alunos.filter((v, i) => medias[i] < 6)

Com Array.map(), uma opção menos otimizada, mas também possível é: (Cuidado: como a função em Array.filter() exclui valores 'falsy', os elementos removidos incluirão: "" (strings vazias) / [] (arrays vazias) / 0 (zero) / 'undefined' e 'null'.)

let reprovados = alunos.map((v, i) => medias[i] < 6 ? v : null).filter(v => v)