Как в 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, ' '));