@Android_system

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

Дан массив чисел. Числа идут по порядку, но иногда встречаются промежутки.
Например [1,2,3, 8,9,10,11, 25,26,27]
Как разбить такой массив на подмассивы, в которых сохраняется порядок чисел, чтобы получить двумерный массив такого вида: [ [1,2,3], [8,9,10,11], [25,26,27] ]
  • Вопрос задан
  • 200 просмотров
Решения вопроса 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 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) })
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы
21 нояб. 2024, в 19:31
500 руб./за проект
21 нояб. 2024, в 19:28
200000 руб./за проект