Делаем просто, ровно то, что спрошено в вопросе:
const result = arr.reduce((acc, n, i, a) => (
n === a[i - 1] + 1 || acc.push([]),
acc.at(-1).push(n),
acc
), []);
Делаем сложно, решаем задачу в более общем виде (группируем элементы не только массивов, а любых итерируемых объектов; условие создания новой группы отделяем от собственно кода группировки):
function groupAdjacent(
data,
{
key = n => n,
newGroup = (c, p) => c !== p,
} = {}
) {
const result = [];
const getVal = key instanceof Function ? key : n => n[key];
let prev = null;
let i = -1;
for (const n of data) {
const curr = getVal(n, ++i);
if (!result.length || newGroup(curr, prev)) {
result.push([]);
}
result.at(-1).push(n);
prev = curr;
}
return result;
}
Как применять в вашем случае:
const result = groupAdjacent(arr, { newGroup: (c, p) => c !== -~p });
// или
const result = groupAdjacent(arr, { key: (n, i) => n - i });
Какие ещё возможны способы применения:
groupAdjacent(arr, { key: 'name' })
groupAdjacent(arr, { newGroup: n => n === 1 })
groupAdjacent(arr).map(n => n.length > 1 ? n : n[0])
groupAdjacent(arr, { newGroup: n => /^\d+\./.test(n) })