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

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

или

Array.from(
  new Set(cars.map(n => n.make)),
  n => ({
    make: n,
    attr: cars.filter(m => m.make === n),
  })
)
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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