Avançando em Arrays

Se você ainda não domina arrays em JavaScript, espero começar a te ajudar a mudar isso! Os arrays, também conhecidos como vetores, são frequentemente utilizados por nós desenvolvedores e estão disponíveis em diversas linguagens de programação. Então pode ter certeza, você vai utilizar muito arrays, portanto saber manipulá-los é algo importantíssimo.

Caso esse seja seu primeiro contato com arrays ou você considera que ainda precisa ver o básico, considere ler primeiro essa breve introdução a arrays, clicando aqui.

Vamos focar nos principais métodos fornecidos pelo JavaScript para manipulação de arrays. E para isso vamos trabalhar com um array de objetos, onde cada item do array será um objeto aluno. Abaixo é mostrado a estrutura do objeto aluno em sua forma literal.

{
    "codigo": "C1332",
    "nome": "joão miguel rocha",
    "notas": [9, 5.6, 2.7]
}

Você pode baixar o nosso array de objetos aluno diretamente em meu Github, clicando aqui. A seguir uma prévia mostrando os dois primeiros alunos.

[
    {
        "codigo": "C1332",
        "nome": "joão miguel rocha",
        "notas": [9, 5.6, 2.7]
    },
    {
        "codigo": "C1333",
        "nome": "joão mathias",
        "notas": [7.3, 6.6, 8.7]
    },
    // ...
]

Map

O map é ideal para aplicar uma transformação no array, por exemplo no array de alunos, todo o nome está com caracteres minúsculos, digamos que seja necessário alterar o de todos os alunos para maiúsculo.

let alunos = [
  {
    "codigo": "C1332",
    "nome": "joão miguel rocha",
    "notas": [9, 5.6, 2.7]
  },
  // restante omitido
] 
alunos = alunos.map(aluno => {
    return {
        codigo: aluno.codigo,
        nome: aluno.nome.toUpperCase(),
        notas: aluno.notas
    }
});

A função map é usada para percorrer o array "alunos". Para cada elemento do array, ele cria um novo objeto com as mesmas propriedades do aluno original, porém com uma modificação específica.

Dentro da função map, é usado uma função de flecha (arrow function) para definir uma operação a ser realizada em cada aluno. A função recebe um parâmetro chamado "aluno", que representa cada elemento do array "alunos".

Dentro da função, é criado um novo objeto com as mesmas propriedades do objeto original, No entanto, a propriedade "nome" é convertida para letras maiúsculas utilizando o método toUpperCase;

Ao final, a função map retorna um novo array contendo os objetos modificados, ou seja, um novo array de alunos com o mesmo código, nome em letras maiúsculas e as notas originais.

Array de alunos completo após a transformação:

[
    {
        "codigo": "C1332",
        "nome": "JOÃO MIGUEL ROCHA",
        "notas": [9, 5.6, 2.7]
    },
    {
        "codigo": "C1333",
        "nome": "JOÃO MATHIAS",
        "notas": [7.3, 6.6, 8.7]
    },
    {
        "codigo": "C4434",
        "nome": "ISAAC BARBOSA",
        "notas": [3.4, 6, 7.7]
    },
    {
        "codigo": "C1248",
        "nome": "VALENTINA GARCIA",
        "notas": [9, 6, 9.8]
    },
    {
        "codigo": "C1623",
        "nome": "PEDRO DIAS",
        "notas": [3.7, 5.8, 6.2]
    },
    {
        "codigo": "C1745",
        "nome": "LORENZO FONSECA",
        "notas": [8.9, 6.7, 7.9]
    }
]

Find

Quando precisamos realizar uma pesquisa no array, podemos utilizar o método find, que nos retorna o primeiro item encontrado, veja o exemplo ao pesquisarmos pelo aluno que contém o nome “JOÃO”:

let filtroAluno = 
    alunos.find(aluno => aluno.nome.includes('JOÃO'));

console.log(filtroAluno);
/*
    {
        "codigo": "C1332",
        "nome": "JOÃO MIGUEL ROCHA",
        "notas": [9, 5.6, 2.7]
    }
*/

FindLast

Similar ao find, porém retorna o último item encontrado, veja como fica o exemplo utilizando findLast pesquisando pelo aluno que contém o nome “JOÃO”:

let filtroAluno = 
    alunos.findLast(aluno => aluno.nome.includes('JOÃO'));

console.log(filtroAluno);
/*
    {
        "codigo": "C1333",
        "nome": "JOÃO MATHIAS",
        "notas": [7.3, 6.6, 8.7]
    }
*/

FindIndex

Muitas vezes vamos precisar obter apenas o índice de onde se encontra o nosso item no array, e a função perfeita para esse trabalho, é a findIndex, e assim como o find, ela retorna o índice da primeira ocorrência encontrada, observe seu exemplo:

let indice = alunos.findIndex(aluno => aluno.nome.includes('JOÃO'));

console.log(indice);
// 0

FindLastIndex

Para buscar o último índice no array, podemos utilizar a função findLastIndex, ela vai nos retornar o último índice da ocorrência.

let indice = 
    alunos.findLastIndex(aluno => aluno.nome.includes('JOÃO'));

console.log(indice);
// 1

Filter

Diferente do find que retorna apenas o primeiro item encontrado, o filter retorna um array com todos os resultados encontrados.

Vamos imaginar que precisamos buscar todos os alunos que tiveram alguma de suas notas inferior a 6, podemos fazer isso combinando o filter e o find, veja o exemplo a seguir:

const alunosNotaMenor6 = 
    alunos.filter(aluno => aluno.notas.find(n => n < 6));

console.log(alunosNotaMenor6);
/* 
[
    {
        "codigo": "C1332",
        "nome": "JOÃO MIGUEL ROCHA",
        "notas": [9, 5.6, 2.7]
    },
    {
        "codigo": "C4434",
        "nome": "ISAAC BARBOSA",
        "notas": [3.4, 6, 7.7]
    },
    {
        "codigo": "C1623",
        "nome": "PEDRO DIAS",
        "notas": [3.7, 5.8, 6.2]
    }
]
*/

Reduce

O reduce faz a somatória de todos os valores de um array e retorna essa soma. Vejamos o código onde aplicamos uma transformação no array com o map para retornar os alunos com uma nova propriedade, que será a média de suas notas. Observe que o reduce tem o exato papel aqui de somar todas as notas para depois conseguirmos realizar o cálculo da média.

const alunosComMedia = alunos.map(aluno => {
    
    const somaNotas = 
        aluno.notas.reduce((total, nota) => total + nota);

    const mediaNotas = somaNotas / aluno.notas.length;
    return {
        codigo: aluno.codigo,
        nome: aluno.nome,
        notas: aluno.notas,
        media: mediaNotas.toFixed(1)
    }
});
console.log(alunosComMedia);
/* 
[
    {
        "codigo": "C1332",
        "media": 5.8,
        "nome": "JOÃO MIGUEL ROCHA",
        "notas": [9, 5.6, 2.7]
    },
    {
        "codigo": "C1333",
        "media": 7.5,
        "nome": "JOÃO MATHIAS",
        "notas": [7.3, 6.6, 8.7]
    },
    {
        "codigo": "C4434",
        "media": 5.7,
        "nome": "ISAAC BARBOSA",
        "notas": [3.4, 6, 7.7]
    }
    // ... 
]
*/

Some

Com o some podemos verificar se existe “algum” no array, por exemplo, o seguinte código verifica se tivemos algum aluno na turma que foi reprovado, ou seja, com média inferior a 6.

Da mesma forma, invertendo a condição, podemos descobrir se a turma teve pelo menos uma aprovação.

O some retorna true ou false.

const peloMenosUmaReprovacao = 
    alunosComMedia.some(x => x.media < 6);

const peloMenosUmaAprovacao = 
    alunosComMedia.some(x => x.media >= 6);

console.log(peloMenosUmaReprovacao);
// true

console.log(peloMenosUmaAprovacao);
// true

Every

Se o método some precisa que pelo menos um item do array satisfaça a condição, o every precisa que todos satisfaçam a condição para retornar true. Veja um exemplo:

// Todos os alunos estão aprovados?
const todosAprovados = alunosComMedia.every(x => x.media >= 6);

// Todos os alunos estão reprovados? 
const todosReprovados = alunosComMedia.every(x => x.media < 6);

console.log(todosAprovados);
// false

console.log(todosReprovados);;
// false

Sort

Quando precisarmos ordenar um array, por qualquer dado que seja, podemos utilizar a função sort, vejamos um exemplo onde queremos ordenar os alunos da maior média para a menor.

const alunosOrdenados = alunosComMedia.sort((a1, a2) => {
    if(a1.media < a2.media) {
        return 1;
    } else if(a1.media > a2.media) {
        return -1;
    }
    return 0;
});
console.log(alunosOrdenados);
/* 
[
    [
    {
        "codigo": "C1248",
        "nome": "VALENTINA GARCIA",
        "notas": [9, 6, 9.8],
        "media": "8.3"
    },
    {
        "codigo": "C1745",
        "nome": "LORENZO FONSECA",
        "notas": [8.9, 6.7, 7.9],
        "media": "7.8"
    },
    {
        "codigo": "C1332",
        "nome": "JOÃO MATHIAS",
        "notas": [7.3, 6.6, 8.7],
        "media": "7.5"
    }
    // ... 
]
*/

Spread (...)

O operador spread (...) pode ser utilizado para criar cópias ou combinar elementos de arrays no JavaScript. Por exemplo, vamos supor que precisamos criar uma nova disciplina e copiar o array de alunos para ela. Podemos fazer assim:

const disciplinaHistoria = [...alunos];

Dessa forma a nossa variável “disciplinaHistoria” contém todos os alunos presentes no array de alunos.

O spread também é útil para combinarmos arrays, apenas para fins didáticos, vamos dividir os alunos por aprovados e reprovados, já vimos que podemos fazer isso utilizando o filter:

const reprovados = alunosComMedia.filter(x => x.media < 6);
const aprovados = alunosComMedia.some(x => x.media >= 6);

console.log(peloMenosUmaReprovacao);
// true

console.log(peloMenosUmaAprovacao);
// true

Agora vamos criar um novo array para combinar os aprovados e reprovados.

const todosAlunos = [...aprovados, ...reprovados];

Como você pode ver, o operador spread é muito versátil quando trabalhamos com arrays.

Conclusão

Agora que você já tem o conhecimento sobre arrays, te convido para construir um projeto de portal do aluno e aplicarmos tudo o que vimos aqui no e-book em um projeto prático, bora? É mais conteúdo gratuito para você, clique aqui para acessar, está disponível em meu canal do youtube.

O conteúdo abordado até agora sobre arrays no JavaScript é apenas o ponto de partida para explorar todo o potencial dessa poderosa estrutura de dados. Para que você continue aprimorando suas habilidades, gostaria de compartilhar dois próximos passos valiosos:

  • Inscreva-se no meu canal do YouTube clicando aqui, para receber atualizações de novos conteúdos relacionados. Lá, você encontrará vídeos exclusivos sobre JavaScript e outras tecnologias, que irão aprofundar ainda mais o seu conhecimento.

  • Cadastre-se na minha newsletter abaixo, para ficar sempre ligado em novos artigos sobre JavaScript e assim não perder nenhuma novidade.

Seja avisado sobre novos artigos
Cadastrado com sucesso!
Ops, atualize a página e tenta novamente.