JavaScript преобразует массив объектов в объект по ключу - PullRequest
0 голосов
/ 11 мая 2018

У меня есть массив таких объектов:

[
  {
    name: 'John',
    email: 'user@mail.com',
    city: 'London',
    type: 'CLIENT'
  },
  {
    name: 'Steve',
    email: 'stave@mail.com',
    city: 'Rome',
    type: 'USER'
  },
  {
    name: 'Mark',
    email: 'mark@mail.com',
    city: 'Paris',
    type: 'ADMIN'
  }
]

Мне нужно преобразовать это в нечто вроде этого:

{
  CLIENT: {
     name: 'John',
     email: 'user@mail.com',
     city: 'London'
  },
  USER: {
     name: 'Steve',
     email: 'stave@mail.com',
     city: 'Rome',
  },
  ADMIN: {
     name: 'Mark',
     email: 'mark@mail.com',
     city: 'Paris',
     type: 'ADMIN'
  }
}

Какой лучший подход?

Спасибо

Ответы [ 3 ]

0 голосов
/ 11 мая 2018

С предстоящими свойствами покоя объекта в ES2018 / ES9 или с BABEL , вы можете взять свойство type и использовать остальные свойства для нового объект для назначения.

var array = [{ name: 'John', email: 'user@mail.com', city: 'London', type: 'CLIENT' }, { name: 'Steve', email: 'stave@mail.com', city: 'Rome', type: 'USER' }, { name: 'Mark', email: 'mark@mail.com', city: 'Paris', type: 'ADMIN' }],
    object = Object.assign(...array.map(({ type, ...o }) => ({ [type]: o })));

console.log(object);
.as-console-wrapper { max-height: 100% !important; top: 0; }
0 голосов
/ 11 мая 2018

Вы также можете использовать reduce() и Object.assign(), чтобы получить требуемый результат.

DEMO

var arr = [{ name: 'John', email: 'user@mail.com', city: 'London', type: 'CLIENT' }, { name: 'Steve', email: 'stave@mail.com', city: 'Rome', type: 'USER' }, { name: 'Mark', email: 'mark@mail.com', city: 'Paris', type: 'ADMIN' }];

console.log(arr.reduce((r,{type,...rest})=>Object.assign(r,{[type]:rest}),{}));
.as-console-wrapper { max-height: 100% !important; top: 0; }
0 голосов
/ 11 мая 2018

Используйте Array#reduce с простой деструктуризацией объекта, чтобы получить желаемый результат:

const data = [{
    name: 'John',
    email: 'user@mail.com',
    city: 'London',
    type: 'CLIENT'
  },
  {
    name: 'Steve',
    email: 'stave@mail.com',
    city: 'Rome',
    type: 'USER'
  },
  {
    name: 'Mark',
    email: 'mark@mail.com',
    city: 'Paris',
    type: 'ADMIN'
  }
];

const result = data.reduce((acc, { type, ...obj }) => {
  acc[type] = obj;
  return acc;
}, {})

console.log(result);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...