Beaucoup de réponses ici utilisent Array.prototype.reduce
pour construire un accumulateur mutable, et font remarquer à juste titre que pour les grands tableaux, c'est plus efficace que, par exemple, l'utilisation d'un opérateur d'étalement 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 syntaxe lambda courte.
Mais une façon de contourner ce problème 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 est implicitement convertie en un nombre comme 0 et 1, vous pouvez la rendre encore plus concise, bien que je ne pense pas qu'elle soit aussi lisible :
function partition(array, predicate) {
return array.reduce((acc, item) => (acc[+!predicate(item)].push(item), acc), [[], []]);
}
Utilisation :
const [trues, falses] = partition(['aardvark', 'cat', 'apple'], i => i.startsWith('a'));
console.log(trues); // ['aardvark', 'apple']
console.log(falses); // ['cat']