Buradaki birçok cevap Array.prototype.reduce, değiştirilebilir bir toplayıcı oluşturmak için kullanılır ve haklı olarak, bunun, örneğin, her yinelemede yeni bir diziyi kopyalamak için bir yayılma operatörü kullanmaktan daha verimli olduğuna işaret edin. Olumsuz yanı, kısa lambda sözdizimini kullanan "saf" bir ifade kadar güzel olmamasıdır.
Ancak bunun bir yolu virgül operatörünü kullanmaktır. C benzeri dillerde virgül, her zaman sağ el operandını döndüren bir operatördür. Bunu, bir void işlevini çağıran ve bir değer döndüren bir ifade oluşturmak için kullanabilirsiniz.
function partition(array, predicate) {
return array.reduce((acc, item) => predicate(item)
? (acc[0].push(item), acc)
: (acc[1].push(item), acc), [[], []]);
}
Bir boole ifadesinin örtük olarak 0 ve 1 olarak bir sayıya dönüştürülmesinden yararlanırsanız ve okunabilir olduğunu düşünmeme rağmen onu daha da kısa hale getirebilirsiniz:
function partition(array, predicate) {
return array.reduce((acc, item) => (acc[+!predicate(item)].push(item), acc), [[], []]);
}
Kullanım:
const [trues, falses] = partition(['aardvark', 'cat', 'apple'], i => i.startsWith('a'));
console.log(trues);
console.log(falses);