Valider un formulaire avant l'envoi, refuser une commande tant qu'une ligne est en rupture, autoriser une publication quand tous les champs obligatoires sont remplis : la question posée est toujours la même, est-ce que tous les éléments respectent la règle.
every y répond par vrai ou faux, sans compteur ni drapeau à gérer soi-même.
Définition
every est une méthode d'Array (tableau) qui appelle une fonction sur chaque élément et rend true uniquement si cette fonction a répondu vrai partout. Un seul élément qui échoue suffit à obtenir false.
const champs = [
{ nom: "email", rempli: true },
{ nom: "motDePasse", rempli: true },
{ nom: "conditions", rempli: false },
];
console.log(champs.every((c) => c.rempli)); // false
console.log(champs.some((c) => c.rempli)); // true
const langues = ["fr", "en", "es"];
console.log(langues.every((l) => l.length === 2)); // trueLe retour est toujours un booléen, jamais l'élément fautif. Il se pose donc directement dans un if, et c'est ce qui distingue every de Array.find(), qui rend l'élément lui-même.
L'arrêt au premier échec
La fonction n'est pas appelée sur tous les éléments : dès qu'une réponse est fausse, le parcours s'interrompt, puisque le verdict ne peut plus changer.
let appels = 0;
const tousPositifs = [1, 2, -3, 4, 5].every((n) => {
appels += 1;
return n > 0;
});
console.log(tousPositifs); // false
console.log(appels); // 3, les valeurs 4 et 5 n'ont pas été examinéesDeux conséquences pratiques. Placer en tête le test le plus susceptible d'échouer accélère la réponse sur les gros tableaux. Et surtout, la fonction ne doit produire aucun Effet de bord : compter, journaliser ou incrémenter à l'intérieur d'un every donne un résultat qui dépend de l'endroit où le parcours s'est arrêté.
Le cas du tableau vide
every rend true sur un tableau vide. Ce n'est pas un défaut : aucune règle n'a été enfreinte, puisque aucun élément n'a été examiné. La surprise arrive en production.
console.log([].every((n) => n > 100)); // true
console.log([].some((n) => n > 100)); // false
const panier = [];
const commandable = panier.every((ligne) => ligne.stock > 0);
console.log(commandable); // true, alors qu'il n'y a rien à commanderLa parade tient en une condition de plus : panier.length > 0 && panier.every(...). Écrivez-la dès que la liste peut arriver vide, ce qui est le cas de presque toute donnée venue d'une base.
Questions fréquentes
Quelle différence avec Array.some() ?
Les deux rendent un booléen, mais ne posent pas la même question. every demande si tous passent, Array.some() si au moins un passe. Le premier s'arrête au premier échec, le second au premier succès. Sur un tableau vide, le premier rend true et le second false.
Peut-on interrompre un every en cours de route ?
Il s'interrompt déjà de lui-même au premier échec, et break n'a aucun effet à l'intérieur d'une fonction. Si vous avez besoin de savoir quel élément a fait échouer le test, Array.find() rend cet élément et findIndex rend sa position.
Comment vérifier que deux tableaux contiennent les mêmes valeurs ?
En comparant d'abord les longueurs, puis chaque position : a.length === b.length && a.every((v, i) => v === b[i]). Le deuxième argument reçu par la fonction est l'index, ce qui rend la comparaison possible. Cela ne vaut que pour des valeurs simples : deux objets au contenu identique restent différents pour l'Égalité stricte (===).