Files
30-seconds-of-code/snippets/partitionBy.md
2020-05-20 18:56:48 +03:00

1.0 KiB

title, tags
title tags
partitionBy array,object,function,intermediate

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

Use Array.prototype.reduce() and Array.prototype.push() to create the start index of each partition. Use Array.prototype.map() to create the slice interval of each partition. Use Array.prototype.slice() to create each partition.

const partitionBy = (arr, fn) =>
  arr
    .reduce((acc, val, i, a) => {
      acc.push(fn(val, i, a));
      return acc;
    }, [])
    .reduce((acc, val, i, a) => {
      if (val !== a[i + 1]) {
        acc.push(i + 1);
      }
      return acc;
    }, [])
    .map((interval, i, a) =>
      i === 0 ? arr.slice(...[0, interval]) : arr.slice(...[a[i - 1], interval])
    );
const numbers = [1, 1, 1, 1, 1, 3, 3, 3, 3, 3, 4, 5, 5, 5, 5, 5];
partitionBy(numbers, n => n % 2 === 0); // = > [ [ 1, 1, 1, 1, 1, 3, 3, 3, 3, 3 ], [ 4 ], [ 5, 5, 5, 5, 5 ] ]
partitionBy(numbers, n => n); // => [ [ 1, 1, 1, 1, 1 ], [ 3, 3, 3, 3, 3 ], [ 4 ], [ 5, 5, 5, 5, 5 ] ]