Javascript получить массив объектов из массива объектов в массив объектов - PullRequest
1 голос
/ 27 июня 2019

У меня есть массив с регистрациями, внутри этого массива есть массив студентов.
Теперь я хочу получить массив всех студентов только с firstName, lastName и email.

массив регистраций

[
  0: {
    date: "2019-04-08T13:51:10.215Z"
    onlyVAT: false,
    students: [
      0: {
        email: "ben@test.be",
        firstName: "Bennn",
        lastName: "test",
        phone: "0898989"
        ...
      }
    ]
  }
]

То, что у меня пока есть:

 this.registrations.map(
    registration => registration.students.map(
        student => { return {
          firstName: student.firstName,
          lastName: student.lastName,
          email: student.email
          }}
      )
    );

, но это возвращает массив массивов

0: [
  0: {firstName: "Bennn", lastName: "test", email: "ben@test.be"},
  1: ...
]

, что я хочу, это массив (частичных) студенческих объектов

[
  0: {firstName: "Bennn", lastName: "test", email: "ben@test.be"},
  1: ...
]

Конечно, я мог бы просто зациклить и нажать на новый массив, но это не то, что я хочу

Ответы [ 4 ]

2 голосов
/ 27 июня 2019

Используйте flat() или flatMap().Пример:

  const newArr = registrations.map(
    registration => registration.students.map(
      student => { return {
        firstName: student.firstName,
        lastName: student.lastName,
        email: student.email
      }}
    )
  ).flat();

  console.log(newArr);
1 голос
/ 27 июня 2019

Вот решение с двумя Array.reduce() функциями и Object.values(), которое гарантирует, что вывод будет содержать только уникальные электронные письма (в примере ввода у меня два идентичных электронных письма ben4@test.be):

const registrations = [
  {
    date: '2019-04-08T13:51:10.215Z',
    onlyVAT: false,
    students: [
      {
        email: 'ben@test.be',
        firstName: 'Bennn',
        lastName: 'test',
        phone: '0898989'
      },
      {
        email: 'ben2@test.be',
        firstName: 'Bennn2',
        lastName: 'test2',
        phone: '0898989'
      }
    ]
  },
  {
    date: '2019-05-08T13:51:10.215Z',
    onlyVAT: false,
    students: [
      {
        email: 'ben3@test.be',
        firstName: 'Bennn3',
        lastName: 'test3',
        phone: '0898989'
      },
      {
        email: 'ben4@test.be',
        firstName: 'Bennn4',
        lastName: 'test4',
        phone: '0898989'
      },
      {
        email: 'ben4@test.be',
        firstName: 'Bennn4',
        lastName: 'test4',
        phone: '0898989'
      }
    ]
  }
];


const result = registrations.reduce((res, {students}) => ({
  ...res,
  ...students.reduce((res2, {email, firstName, lastName}) => ({
    ...res2,
    [email]: {email, firstName, lastName}
  }), {})
}), {});

console.log(Object.values(result));
1 голос
/ 27 июня 2019

Просто используйте flatMap.

this.registrations.flatMap(...);

Или используйте reduce:

this.registrations.map(...).reduce((a, c) => [...a, c], []);
0 голосов
/ 27 июня 2019

Результат получается в такой форме, поскольку students - это поле внутри объекта в массиве.

Вы можете просто применить комбинацию операторов распространения concat и ... к результату, полученному из карты, чтобы получить окончательный массив студентов.

const studentsMapped = this.registrations.map(
    registration => registration.students.map(
        student => { return {
            firstName: student.firstName,
            lastName: student.lastName,
            email: student.email
       }}
    )
);

const students = [].concat(...studentsMapped);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...