Skip to main content
File

title: partitionBy tags: array,object,function,advanced

TS JS Deno

Applies fn to each value in arr, splitting it each time fn returns a new value.

Use Array.prototype.reduce() with an accumulator object that will hold the resulting array and the last value returned from fn. Use Array.prototype.push() to add each value in arr to the appropriate partition in the accumulator array.

const partitionBy = <R = any>(arr: any[], fn: MapFunc<any, R>) =>
  arr.reduce(
    ({ res, last }, v, i, a) => {
      const next = fn(v, i, a);
      if (next !== last) res.push([v]);
      else res[res.length - 1].push(v);
      return { res, last: next };
    },
    { res: [] }
  ).res;
const numbers = [1, 1, 3, 3, 4, 5, 5, 5];
partitionBy(numbers, (n) => n % 2 === 0); // [[1, 1, 3, 3], [4], [5, 5, 5]]
partitionBy(numbers, (n) => n); // [[1, 1], [3, 3], [4], [5, 5, 5]]