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 } ]