跳到主要内容

partitionBy

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.

typescript
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;
typescript
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]]