Le panier contient-il un article en rupture ? Un des champs du formulaire est-il vide ? Ces questions attendent un oui ou un non, pas une liste.
some répond exactement à cette forme de question, et arrête son parcours dès qu'il a de quoi répondre.
Définition
some est une méthode d'Array (tableau) qui rend true dès qu'un élément passe le test, et false si aucun ne passe. Son opposé, every, rend true seulement si tous passent.
const panier = [
{ nom: "clavier", stock: 0 },
{ nom: "souris", stock: 4 },
];
console.log(panier.some((a) => a.stock === 0)); // true
console.log(panier.every((a) => a.stock > 0)); // falseLa fonction reçoit les trois arguments habituels, l'élément, son index et le tableau complet, les deux derniers servant rarement. Comme pour Array.filter(), son retour n'a pas besoin d'être un booléen : sa nature Truthy et falsy suffit à trancher.
L'arrêt anticipé
Le parcours cesse au premier succès, ce qui compte sur un test coûteux ou un tableau long.
const vus = [];
[1, 2, 3, 4, 5].some((n) => {
vus.push(n);
return n > 2;
});
console.log(vus); // [ 1, 2, 3 ]Trois éléments visités sur cinq. every suit la règle symétrique : il s'arrête au premier échec, puisqu'un seul suffit à condamner l'ensemble.
Le cas du tableau vide
C'est le comportement qui surprend le plus, et il est parfaitement logique une fois posé dans le bon sens.
console.log([].some(() => true)); // false
console.log([].every(() => false)); // truesome cherche un exemple et n'en trouve aucun, il répond donc non. every cherche un contre-exemple et n'en trouve aucun non plus, il répond donc oui. Un test du genre « tous les champs sont remplis » vaut ainsi true sur un formulaire sans champ, ce qui mérite souvent une vérification de la longueur en amont.
Questions fréquentes
some ou includes ?
includes cherche une valeur précise et compare avec l'Égalité stricte (===), ce qui le limite aux nombres, chaînes et booléens. Sur des objets il échoue toujours, sauf à comparer la même référence. Dès qu'il y a un critère, c'est some qu'il faut.
Comment écrire l'inverse de every ?
Par some avec le test inversé : « tous positifs » est faux exactement quand « au moins un négatif ou nul » est vrai. Cette réécriture évite un ! posé devant un appel entier, que l'œil saute une fois sur deux, et elle dit en clair ce que le test cherche vraiment.
some est-il plus rapide que Array.filter() ?
Pour répondre à une question par oui ou non, oui, et souvent nettement. filter parcourt tout le tableau et construit un résultat dont on ne lira que la longueur, alors que some s'arrête au premier élément qui convient.