Use reduce to split array into two groups based on condition
const numbers = [1, 2, 3, 4, 5, 6];
const [evens, odds] = numbers.reduce(
([pass, fail], num) =>
num % 2 === 0
? [[...pass, num], fail]
: [pass, [...fail, num]],
[[], []]
);
console.log(evens, odds); // [2, 4, 6] [1, 3, 5]const users = [
{ name: 'Alice', age: 25, active: true },
{ name: 'Bob', age: 17, active: false },
{ name: 'Charlie', age: 30, active: true },
{ name: 'Dave', age: 16, active: true }
];
// Partition by condition
const partition = (arr, predicate) => {
return arr.reduce(
([pass, fail], item) =>
predicate(item)
? [[...pass, item], fail]
: [pass, [...fail, item]],
[[], []]
);
};
const [adults, minors] = partition(users, u => u.age >= 18);
console.log('Adults:', adults.map(u => u.name));
console.log('Minors:', minors.map(u => u.name));
// More efficient with push
const partition2 = (arr, predicate) => {
const pass = [], fail = [];
arr.forEach(item => (predicate(item) ? pass : fail).push(item));
return [pass, fail];
};function partitionBy(arr, fn) {
return arr.reduce((acc, item) => {
const key = fn(item);
(acc[key] = acc[key] || []).push(item);
return acc;
}, {});
}const partitionN = (arr, n) =>
arr.reduce((acc, item, i) => {
acc[i % n].push(item);
return acc;
}, Array.from({ length: n }, () => []));Avoid filtering twice
// DON'T DO THIS - iterates array twice
const evens = arr.filter(n => n % 2 === 0);
const odds = arr.filter(n => n % 2 !== 0);✓ Works in all modern browsers (ES2015+)