Array.filter() en JavaScript : ne garder que les éléments qui passent un test

filter rend un nouveau tableau des éléments pour lesquels la fonction est vraie : la règle du test, le cas du tableau vide et le choix face à find.
3 min de lecture
Believemy logo

Ne garder que les commandes payées, que les fichiers d'une extension, que les utilisateurs actifs : le geste est si fréquent que le langage lui a réservé une méthode, et qu'écrire une boucle pour cela ne se justifie plus.

filter conserve ce qui passe un test et écarte le reste, sans jamais toucher au tableau d'origine.


Définition

filter est une méthode d'Array (tableau) qui appelle une fonction sur chaque élément et rend un nouveau tableau formé de ceux pour lesquels cette fonction a répondu vrai. Sa longueur est donc inférieure ou égale à celle du départ.

JAVASCRIPT
const commandes = [
  { id: 1, payee: true, montant: 49 },
  { id: 2, payee: false, montant: 19 },
  { id: 3, payee: true, montant: 99 },
];

const payees = commandes.filter((c) => c.payee);
console.log(payees.length);   // 2

const grosses = commandes.filter((c) => c.montant > 500);
console.log(grosses);         // []

La dernière ligne mérite l'attention : filter rend toujours un tableau, vide le cas échéant, jamais undefined. On peut donc le parcourir ou lire sa longueur sans vérification préalable.


Ce que la fonction doit rendre

Le retour n'a pas besoin d'être un booléen : c'est sa nature Truthy et falsy qui décide. Une chaîne vide, 0, null et undefined écartent l'élément, tout le reste le conserve.

JAVASCRIPT
const brut = ["fr", "", null, "en", undefined, "es"];

console.log(brut.filter(Boolean));   // [ 'fr', 'en', 'es' ]

Passer Boolean (booléen) directement comme fonction de test est l'idiome consacré pour nettoyer un tableau de ses valeurs vides. Il tient parce que Boolean ignore les deuxième et troisième arguments que filter lui transmet.


filter, find ou some

Ce que vous cherchezMéthodeCe que vous recevez
Tous ceux qui passentfilterUn tableau
Le premier qui passeArray.find()L'élément, ou undefined
Savoir s'il en existe unArray.some()Un booléen
Compter ceux qui passentfilter puis lengthUn nombre

La deuxième ligne est celle qu'on rate le plus souvent : écrire filter(...)[0] parcourt tout le tableau pour un seul élément, quand find s'arrête au premier trouvé.


Questions fréquentes

Question

filter modifie-t-il le tableau d'origine ?

Jamais. Il en construit un nouveau, qui contient les mêmes objets et non des copies. Modifier une propriété d'un élément filtré se voit donc dans les deux tableaux, puisque c'est le même objet référencé deux fois.

Question

Comment retirer un élément par identifiant ?

En gardant tous les autres, avec liste.filter((c) => c.id !== cible). Cette écriture remplace avantageusement splice, qui modifie le tableau sur place et oblige à en connaître la position exacte.

Question

Enchaîner filter et Array.map() coûte-t-il deux parcours ?

Oui, deux parcours au lieu d'un. Sur quelques centaines d'éléments, la lisibilité de l'enchaînement vaut largement cette dépense. Au-delà de plusieurs dizaines de milliers, une seule boucle ou un Array.reduce() devient défendable.

Termes connexes

Découvrez notre glossaire JavaScript

Tous les mots de JavaScript expliqués simplement : mots-clés, objets natifs, méthodes, erreurs et concepts. Définitions claires et exemples qui tournent, pour apprendre et pour se dépanner.

Partager cet article

Tu veux nous aider ? Fais un lien vers cet article sur tes réseaux ou encore mieux : sur ton site, dans un article ou dans ta newsletter.