ここでの多くの回答はArray.prototype.reduce、可変アキュムレータの構築に使用されます。大きな配列の場合、これは、たとえば、スプレッド演算子を使用して反復ごとに新しい配列をコピーするよりも効率的であることを正しく指摘します。欠点は、短いラムダ構文を使用した「純粋な」式ほどきれいではないことです。
しかし、それを回避する方法は、コンマ演算子を使用することです。Cのような言語では、コンマは常に右側のオペランドを返す演算子です。これを使用して、void関数を呼び出して値を返す式を作成できます。
function partition(array, predicate) {
return array.reduce((acc, item) => predicate(item)
? (acc[0].push(item), acc)
: (acc[1].push(item), acc), [[], []]);
}
ブール式が暗黙的に0と1の数値にキャストされるという事実を利用すると、読みやすくはないと思いますが、さらに簡潔にすることができます。
function partition(array, predicate) {
return array.reduce((acc, item) => (acc[+!predicate(item)].push(item), acc), [[], []]);
}
使用法:
const [trues, falses] = partition(['aardvark', 'cat', 'apple'], i => i.startsWith('a'));
console.log(trues);
console.log(falses);