Back to Home
Arrays

How to Partition Arrays

Use reduce to split array into two groups based on condition

Quick Answer (2024 ES6+ Way)

javascript
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]

Live Example

javascript
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];
};

Common Variations

Multi-way Partition
javascript
function partitionBy(arr, fn) {
  return arr.reduce((acc, item) => {
    const key = fn(item);
    (acc[key] = acc[key] || []).push(item);
    return acc;
  }, {});
}
Partition Into N Groups
javascript
const partitionN = (arr, n) =>
  arr.reduce((acc, item, i) => {
    acc[i % n].push(item);
    return acc;
  }, Array.from({ length: n }, () => []));

❌ Don't Do This (Outdated Way)

Avoid filtering twice

javascript
// DON'T DO THIS - iterates array twice
const evens = arr.filter(n => n % 2 === 0);
const odds = arr.filter(n => n % 2 !== 0);

Browser Support

Works in all modern browsers (ES2015+)

#array#partition#split