Applies fn
to each value in arr
, splitting it each time the provided function returns a new value.
Array.prototype.reduce()
with an accumulator object that will hold the resulting array and the last value returned from fn
.Array.prototype.push()
to add each value in arr
to the appropriate partition in the accumulator array.const partitionBy = (arr, fn) =>
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]]
JavaScript, Array
Groups the elements into two arrays, depending on the provided function's truthiness for each element.
JavaScript, Array
Creates an object from an array, using a function to map each value to a key.
JavaScript, Array
Returns the symmetric difference between two arrays, after applying the provided function to each array element of both.