30秒学会 JavaScript 片段 · 2017年12月24日

30秒学会 JavaScript 片段 – partitionBy

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 = (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]]