Rất nhiều câu trả lời ở đây sử dụng Array.prototype.reduceđể xây dựng một bộ tích lũy có thể thay đổi và chỉ ra một cách chính xác rằng đối với các mảng lớn, điều này hiệu quả hơn, giả sử, sử dụng toán tử spread để sao chép một mảng mới mỗi lần lặp lại. Nhược điểm là nó không đẹp như một biểu thức "thuần túy" sử dụng cú pháp lambda ngắn.
Nhưng một cách giải quyết đó là sử dụng toán tử dấu phẩy. Trong các ngôn ngữ giống C, dấu phẩy là một toán tử luôn trả về toán hạng bên phải. Bạn có thể sử dụng nó để tạo một biểu thức gọi một hàm void và trả về một giá trị.
function partition(array, predicate) {
return array.reduce((acc, item) => predicate(item)
? (acc[0].push(item), acc)
: (acc[1].push(item), acc), [[], []]);
}
Nếu bạn tận dụng thực tế là biểu thức boolean chuyển ngầm thành một số là 0 và 1, và bạn có thể làm cho nó ngắn gọn hơn nữa, mặc dù tôi không nghĩ rằng nó có thể đọc được:
function partition(array, predicate) {
return array.reduce((acc, item) => (acc[+!predicate(item)].push(item), acc), [[], []]);
}
Sử dụng:
const [trues, falses] = partition(['aardvark', 'cat', 'apple'], i => i.startsWith('a'));
console.log(trues);
console.log(falses);