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

Как сгруппировать элементы массива по общему значению?

Есть массив, например, такого вида (из интернетов):
const cars = [
  { make: 'audi', model: 'r8', year: '2012' },
  { make: 'audi', model: 'rs5', year: '2013' },
  { make: 'ford', model: 'mustang', year: '2012' },
  { make: 'ford', model: 'fusion', year: '2015' },
  { make: 'kia', model: 'optima', year: '2012' },
];

Мне нужно привести его к виду:
const formatted = [
  {
    make: 'kia', 
    attr: [
      { make: 'kia', model: 'optima', year: '2012' }
    ]
  },
  {
    make: 'ford',
    attr: [
      { make: 'ford', model: 'mustang', year: '2012' },
      { make: 'ford', model: 'fusion', year: '2015' }
    ]
  },
  {
    make: 'audi',
    attr: [
      { make: 'audi', model: 'r8', year: '2012' },
      { make: 'audi', model: 'rs5', year: '2013' }
    ]
  }


Делаю так:
const grouped = cars.reduce((acc, curr) => {
        const group = curr.make;

        acc[group] = [...acc[group] || [], curr];

        return acc;
    }, []);

// Результат
kia: [{ make: 'kia', model: 'optima', year: '2012' }],
...

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

const result = Object.values(cars.reduce((acc, n) => (
  (acc[n.make] ??= { make: n.make, attr: [] }).attr.push(n),
  acc
), {}));

Делаем сложно:

function group(data, key, val = n => n) {
  const getKey = key instanceof Function ? key : n => n[key];
  const getVal = val instanceof Function ? val : n => n[val];
  const result = new Map;

  for (const n of data) {
    const k = getKey(n);
    result.set(k, result.get(k) ?? []).get(k).push(getVal(n));
  }

  return result;
}

const result = Array.from(
  group(cars, 'make'),
  ([ make, attr ]) => ({ make, attr })
);
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

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