Задать вопрос
@New-Developer
Изучаю JavaScript

Как последовательные числа сложить в отдельные массивы?

Как из массива чисел

[-1, 0, 1, 2, 3, 5, 7, 8, 9, 11, 14, 15, 17, 18, 20]

получить вложенные массивы последовательных чисел только встроенными функциями JS?
Чтобы получилось:

[[-1, 0, 1, 2, 3], [5], [7, 8, 9], [11], [14, 15], [17, 18], [20]]
  • Вопрос задан
  • 301 просмотр
Подписаться 1 Средний Комментировать
Помогут разобраться в теме Все курсы
  • Яндекс Практикум
    Фронтенд-разработчик
    10 месяцев
    Далее
  • Skillbox
    JavaScript
    3 месяца
    Далее
  • Нетология
    Fullstack-разработчик на Python + нейросети
    20 месяцев
    Далее
Решения вопроса 1
0xD34F
@0xD34F Куратор тега JavaScript
Делаем просто:

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 });
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы