Как в js преобразовать массив объектов в объект?

Вот пример массива:

  const myArray = [
    {
      data: {
        name: 'Alex',
        city: 'London',
        year: '1991',
      },
    },
    {
      data: {
        name: 'John',
        city: 'London',
        year: '1992',
      },
    },
    {
      data: {
        name: 'Alice',
        city: 'Paris',
        year: '1989',
      },
    },
    {
      data: {
        name: 'Romeo',
        city: 'Rome',
        year: '1990',
      },
    },
    {
      data: {
        name: 'Michael',
        city: 'London',
        year: '1989',
      },
    },
  ];

Нужно получить:

  const myObject = {
    London: [
      {
        data: {
          name: 'Alex',
          city: 'London',
          year: '1991',
        },
      },
      {
        data: {
          name: 'John',
          city: 'London',
          year: '1992',
        },
      },
      {
        data: {
          name: 'Michael',
          city: 'London',
          year: '1989',
        },
      },
    ],
    Paris: [
      {
        data: {
          name: 'Alice',
          city: 'Paris',
          year: '1989',
        },
      },
    ],
    Rome: [
      {
        data: {
          name: 'Romeo',
          city: 'Rome',
          year: '1990',
        },
      },
    ],
  };

Ответы (1 шт):

Автор решения: vsemozhebuty

Обычно, если из массива методом каких-то вычислений нужно получить не-массив (объект, число, строку и т.д.), пользуются Array.prototype.reduce().

Если оператор ??= вам ещё незнаком, почитать можно тут: Logical nullish assignment (??=). Его удобно использовать, когда вы коллекционируете какие-то данные в ключах объекта, чтобы задать начальное значение при создании контейнера.

const myArray = [
    {
      data: {
        name: 'Alex',
        city: 'London',
        year: '1991',
      },
    },
    {
      data: {
        name: 'John',
        city: 'London',
        year: '1992',
      },
    },
    {
      data: {
        name: 'Alice',
        city: 'Paris',
        year: '1989',
      },
    },
    {
      data: {
        name: 'Romeo',
        city: 'Rome',
        year: '1990',
      },
    },
    {
      data: {
        name: 'Michael',
        city: 'London',
        year: '1989',
      },
    },
];

const myArrayByCity = myArray.reduce(
  (acc, object) => {
    const city = object.data.city;
    acc[city] ??= [];
    acc[city].push(object);
    return acc;
  },
  {},
);

console.log(JSON.stringify(myArrayByCity, null, '  '));

→ Ссылка