[-1, 0, 1, 2, 3, 5, 7, 8, 9, 11, 14, 15, 17, 18, 20][[-1, 0, 1, 2, 3], [5], [7, 8, 9], [11], [14, 15], [17, 18], [20]]
const result = arr.reduce((acc, n, i, a) => (
n === a[i - 1] + 1 || acc.push([]),
acc[acc.length - 1].push(n),
acc
), []);function groupAdjacent(
data,
{
key = n => n,
newGroup = (c, p) => c !== p,
} = {}
) {
const getVal = key instanceof Function ? key : n => n[key];
return Array.prototype.reduce.call(
data,
(acc, n, i) => {
const v = getVal(n, i);
const iGroup = acc[0].length - (i && !newGroup(v, acc[1]));
(acc[0][iGroup] ??= []).push(n);
acc[1] = v;
return acc;
},
[ [], null ]
)[0];
}const result = groupAdjacent(arr, { newGroup: (c, p) => c !== -~p });
// или
const result = groupAdjacent(arr, { key: (n, i) => n - i });