Executando verificação de segurança...
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 } ]
Carregando publicação patrocinada...
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