@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' }],
...

но мне такой вид не подходит, не совсем понимаю, как преобразовать, чтобы получить желаемый результат.
  • Вопрос задан
  • 136 просмотров
Решения вопроса 1
0xD34F
@0xD34F Куратор тега JavaScript
const group = (arr, idKey, groupKey) =>
  Object.values(arr.reduce((acc, n) => (
    acc[n[idKey]] ??= { [idKey]: n[idKey], [groupKey]: [] },
    acc[n[idKey]][groupKey].push(n),
    acc
  ), {}));


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

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

Войти через центр авторизации
Похожие вопросы