คำตอบจำนวนมากที่นี่ใช้Array.prototype.reduceในการสร้างตัวสะสมที่เปลี่ยนแปลงได้และชี้ให้เห็นอย่างถูกต้องว่าสำหรับอาร์เรย์ขนาดใหญ่สิ่งนี้มีประสิทธิภาพมากกว่าการใช้ตัวดำเนินการกระจายเพื่อคัดลอกอาร์เรย์ใหม่ในแต่ละการวนซ้ำ ข้อเสียคือมันไม่สวยเท่านิพจน์ "บริสุทธิ์" ที่ใช้ไวยากรณ์แลมบ์ดาแบบสั้น
แต่วิธีแก้ปัญหานั้นคือการใช้ตัวดำเนินการลูกน้ำ ในภาษาคล้าย C เครื่องหมายจุลภาคเป็นตัวดำเนินการที่ส่งกลับตัวถูกดำเนินการทางขวามือเสมอ คุณสามารถใช้สิ่งนี้เพื่อสร้างนิพจน์ที่เรียกใช้ฟังก์ชันโมฆะและส่งคืนค่า
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);