Beaucoup de réponses ici utilisent Array.prototype.reducepour construire un accumulateur mutable, et soulignent à juste titre que pour les grands tableaux, c'est plus efficace que, par exemple, d'utiliser un opérateur de propagation pour copier un nouveau tableau à chaque itération. L'inconvénient est que ce n'est pas aussi joli qu'une expression "pure" utilisant la courte syntaxe lambda.
Mais un moyen de contourner cela est d'utiliser l'opérateur virgule. Dans les langages de type C, la virgule est un opérateur qui renvoie toujours l'opérande de droite. Vous pouvez l'utiliser pour créer une expression qui appelle une fonction void et renvoie une valeur.
function partition(array, predicate) {
return array.reduce((acc, item) => predicate(item)
? (acc[0].push(item), acc)
: (acc[1].push(item), acc), [[], []]);
}
Si vous tirez parti du fait qu'une expression booléenne convertit implicitement un nombre comme 0 et 1, et vous pouvez la rendre encore plus concise, même si je ne pense pas qu'elle soit aussi lisible:
function partition(array, predicate) {
return array.reduce((acc, item) => (acc[+!predicate(item)].push(item), acc), [[], []]);
}
Usage:
const [trues, falses] = partition(['aardvark', 'cat', 'apple'], i => i.startsWith('a'));
console.log(trues);
console.log(falses);