Задать вопрос
@Android_system

Как разбить массив на подмассивы, отсортировать по рядам упорядоченных чисел?

Дан массив чисел. Числа идут по порядку, но иногда встречаются промежутки.
Например [1,2,3, 8,9,10,11, 25,26,27]
Как разбить такой массив на подмассивы, в которых сохраняется порядок чисел, чтобы получить двумерный массив такого вида: [ [1,2,3], [8,9,10,11], [25,26,27] ]
  • Вопрос задан
  • 237 просмотров
Подписаться 1 Простой 1 комментарий
Помогут разобраться в теме Все курсы
  • Нетология
    Fullstack-разработчик на Python + нейросети
    20 месяцев
    Далее
  • Skillfactory
    Профессия Веб-разработчик
    12 месяцев
    Далее
  • Академия Eduson
    Fullstack-разработчик на JavaScript
    11 месяцев
    Далее
Решения вопроса 1
0xD34F
@0xD34F Куратор тега JavaScript
Делаем просто, ровно то, что спрошено в вопросе:

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 iter = data[Symbol.iterator]();
  const getVal = key instanceof Function ? key : n => n[key];

  for (
    let group = [], prev = null, n, i = -1;
    !n?.done && (n = iter.next());
    n.done || group.push(n.value)
  ) {
    let groupDone = false;

    if (!n.done) {
      const curr = getVal(n.value, ++i);
      groupDone = i && newGroup(curr, prev);
      prev = curr;
    }

    if ((n.done && group.length) || groupDone) {
      yield group;
      group = [];
    }
  }
}

Как применять в вашем случае:

const result = [...groupAdjacent(arr, { newGroup: (c, p) => c !== -~p })];
// или
const result = Array.from(groupAdjacent(arr, { key: (n, i) => n - i }));
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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