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

Как сгруппировать расположенные последовательно элементы массива с одинаковыми значениями одного из свойств?

Есть массив:

const array = [
    { name: 'one', value: 1 },
    { name: 'one', value: 2  },
    { name: 'two', value: 3 },
    { name: 'one', value: 4 },
];

Надо сгруппировать соседние объекты с одинаковыми name'ами:

const result = [
           [
                { name: 'one', value: 1 },
                { name: 'one', value: 2  }
            ],
            [
                { name: 'two', value: 3 },
            ],
            [
                { name: 'one', value: 4 },
            ]
];

Как это сделать?
  • Вопрос задан
  • 153 просмотра
Подписаться 1 Средний Комментировать
Помогут разобраться в теме Все курсы
  • Нетология
    Fullstack-разработчик на Python + нейросети
    20 месяцев
    Далее
  • Skillfactory
    Профессия Веб-разработчик
    12 месяцев
    Далее
  • Яндекс Практикум
    Фронтенд-разработчик
    10 месяцев
    Далее
Решения вопроса 1
0xD34F
@0xD34F Куратор тега JavaScript
Делаем просто:

const result = arr.reduce((acc, n, i, a) => (
  (i && n.name === a[~-i].name) || acc.push([]),
  acc.at(-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.name !== p.name });
// или
const result = groupAdjacent(arr, { key: 'name' });
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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