Wiele odpowiedzi tutaj używa Array.prototype.reducedo zbudowania zmiennego akumulatora i słusznie wskazuje, że w przypadku dużych tablic jest to bardziej wydajne niż, powiedzmy, użycie operatora rozprzestrzeniania do kopiowania nowej tablicy w każdej iteracji. Wadą jest to, że nie jest tak ładne jak „czyste” wyrażenie używające krótkiej składni lambda.
Ale sposobem na obejście tego jest użycie operatora przecinka. W językach podobnych do języka C przecinek jest operatorem, który zawsze zwraca operand po prawej stronie. Możesz użyć tego do utworzenia wyrażenia, które wywołuje funkcję void i zwraca wartość.
function partition(array, predicate) {
return array.reduce((acc, item) => predicate(item)
? (acc[0].push(item), acc)
: (acc[1].push(item), acc), [[], []]);
}
Jeśli wykorzystasz fakt, że wyrażenie boolowskie niejawnie rzutuje na liczbę jako 0 i 1, możesz uczynić to jeszcze bardziej zwięzłym, chociaż nie sądzę, że jest tak czytelny:
function partition(array, predicate) {
return array.reduce((acc, item) => (acc[+!predicate(item)].push(item), acc), [[], []]);
}
Stosowanie:
const [trues, falses] = partition(['aardvark', 'cat', 'apple'], i => i.startsWith('a'));
console.log(trues);
console.log(falses);