Executando verificação de segurança...
3

Domine o método Filter e simplifique sua lógica com arrays em Javascript

Você sabia que o método filter em Javascript tem a mesma função que um filtro na hora de passar café?

o processo de filtrar água e pó de café e resultar em café

  1. Existe uma lista de ingredientes: água e pó de café
  2. O filtro escolhe o que passa e o que fica com base em um critério: só passa o que for líquido
  3. E o resultado final: café passado

Em Javascript, acontece a mesma coisa.

  1. Existe uma array de itens (dados de produtos, clientes, etc)
  2. O método filter tem os critério para escolher quais itens passam (farão parte da nova array) e quais ficam (não farão parte da nova array)
  3. A array que o método retorna é o resultado final

Outras coisas que você deve saber sobre esse método:

  • O return do filter sempre é um valor booleano
  • O filter não altera os elementos da array original, apenas decide se insere eles ou não na array original
  • Função callback e os três parâmetros
    • item
    • index
    • array
  • Qual linha de raciocínio seguir para saber se devo usar o filter

Expliquei todos esses pontos em detalhes no meu blog, vou deixar o link abaixo nas fontes.

Qualquer dúvida, comenta ai que vou fazer o máximo para te ajudar :D

Carregando publicação patrocinada...
1

Muito bom, só uns detalhes sobre o post.

Em certo ponto é dito que "O return do filter sempre é um booleano". Mas só pra ser pedante (sou mesmo, fazer o que), o retorno da função de callback é um booleano, mas o retorno do filter é um array com os resultados. Ou seja:

// o retorno do filter é outro array, contendo os resultados da filtragem
const resultado = array.filter(
    // esta é a função de callback
    function(elemento) {
        // o retorno dela é um booleano
        return elemento == valorFiltrado;
    }
);

Outro ponto é que vários exemplos terminam com if (condicao) return true; else return false;:

fruits.filter(function(fruit) {
  const color = fruit.color;
  const vitamins = fruit.vitamins;
  if (color === 'Amarela' && vitamins.includes('K')) {
    return true;
  } else {
    return false;
  }
});

Mas sempre que vc tem algo assim, vc pode trocar por return condicao. Ou seja, o código acima poderia ser:

fruits.filter(function(fruit) {
  const color = fruit.color;
  const vitamins = fruit.vitamins;

  return color === 'Amarela' && vitamins.includes('K');
});

Vc até chega a mencionar isso quando cita as arrow functions, só achei estranho não manter o mesmo padrão nos outros exemplos.


Vale lembrar também que, embora filter retorne outro array, os elementos dentro deste array serão os mesmos do array original:

const array = [
    { nome: 'Fulano', idade: 10 },
    { nome: 'Ciclano', idade: 20 },
    { nome: 'Beltrano', idade: 30 },
    { nome: 'Trajano', idade: 40 }
];
// filtrar idades maiores que 25
const filtrado = array.filter(elemento => elemento.idade > 25);
console.log(filtrado[0]); // { nome: 'Beltrano', idade: 30 }

// muda a idade de Beltrano no array filtrado
filtrado[0].idade = 5;
// a idade também foi alterada no array original
console.log(array[2]); // { nome: 'Beltrano', idade: 5 }

// isso acontece porque ambos os arrays contém o mesmo objeto
console.log(array[2] === filtrado[0]); // true

Por fim, uma curiosidade: o método filter é genérico e aceita qualquer objeto "array-like" (algo que "se parece com um array"), bastando que este tenha propriedades que correspondem aos índices e ao tamanho:

const objetoQueSimulaArray = {
    length: 4,
    0: { nome: 'Fulano', idade: 10 },
    1: { nome: 'Ciclano', idade: 20 },
    2: { nome: 'Beltrano', idade: 30 },
    3: { nome: 'Trajano', idade: 40 }
};

const filtrado = Array.prototype.filter.call(objetoQueSimulaArray, elemento => elemento.idade > 25);
console.log(filtrado); // [ { nome: 'Beltrano', idade: 30 }, { nome: 'Trajano', idade: 40 } ]
1

Sobre a frase "O return do filter sempre é um booleano", vc tem razão. Eu falei "return do filter" mas quis dizer "return do callback do filter".

Sobre os exemplos que terminam com if (condicao) return true; else return false;, eu preferi deixar assim bem claro para as pessoas que estão começando e não estão familiarizadas com return condicao de forma direta. Inclusive tem um trecho do post que falo sobre como deixar o código de forma mais direta, mas que isso não é obrigatório, inclusive inserindo arrow function. Eu não mantive esse padrão ao longo do texto pq se a pessoa tá começando, vai ficar mais chatinho pra ela. Do jeito que deixei, todos podem entender com maior facilidade.

"Vale lembrar também que, embora filter retorne outro array, os elementos dentro deste array serão os mesmos do array original:". Esse ponto tentei deixar bem claro, pois é fundamental no filter. Mas para não passar em branco, dei exemplos de conectar um filter com um map para alterar esses elementos, só pra deixar completinho.

"o método filter é genérico" esse teu último exemplo eu não conhecia, muito legal saber disso. A questão aqui é que existem coisas que na minha limitada opinião são pouco usadas no dia a dia, principalmente na programação funcional, que é o mais usado com Javascript. Coisas de orientação a objetos como call, apply, mudar o contexto do this (var newArray = arr.filter(callback, thisArg)), são coisas pouco usadas, pelo menos por mim. E como não domino isso, resolvi não abordar.

Valeu pelo comentário :D