Угловой 6 объединить два массива, если ID совпадает плюс показать все из первого массива - PullRequest
0 голосов
/ 23 декабря 2018

У меня есть два массива

schools = [{name: school 1, id: 1, address: 'address'}, {name: school 2, id: 2, address: 'address'}, {name: school 3, id: 3, address: 'address'}, {name: school 4, id: 4, address: 'address'}];

apply_status = [{user_name: 'name', school_id = 1, applied_status: pending }, {user_name: 'name', school_id = 2, applied_status: accepted}, {user_name: 'name', school_id = 4, applied_status: accepted},]

До сих пор я пробовал это

this.status = (this.schools, this.applyStatus) =>
    this.schools.map(itm =>
      ({
        ...this.applyStatus.find((item) =>
          (item.school_id === itm.id) && item), ...itm
      }));

, это дает только два совпадающих результата.Я также хотел бы показать третью школу, даже если там нет идентификатора для сопоставления.

Мой желаемый результат:

status = [{name: school 1, id: 1, address: 'address', applied_status: pending}, {name: school 2, id: 2, address: 'address', applied_status: accepted}, {name: school 3, id: 3, address: 'address'}, {name: school 4, id: 4, address: 'address', applied_status: accepted}];

любая помощь очень ценится

Ответы [ 3 ]

0 голосов
/ 23 декабря 2018

Вы можете узнать applied_status школ, используя array#find, а затем отправить результат в зависимости от значения applied_status в массиве.

let schools = [{name: 'school 1', id: 1, address: 'address'}, {name: 'school 2', id: 2, address: 'address'}, {name: 'school 3', id: 3, address: 'address'}, {name: 'school 4', id: 4, address: 'address'}],
    apply_status = [{user_name: 'name', school_id: 1, applied_status: 'pending' }, {user_name: 'name', school_id: 2, applied_status: 'accepted'}, {user_name: 'name', school_id: 4, applied_status: 'accepted'}],
    status = schools.map(school => {
      let {applied_status} = apply_status.find(o => school.id === o.school_id) || {};
      return applied_status ? ({...school, status: applied_status}) : ({...school});
    });
console.log(status);
0 голосов
/ 23 декабря 2018

Итак, вот мой способ сделать это:

 this.schools.forEach(item => {
      let status = this.applyStatus.find(x => x.school_id === item.id);
      if (status) {
        item['applied_status'] = status.applied_status;
      }
    });

проверить этот stackbliz рабочий код.

0 голосов
/ 23 декабря 2018

Вы были почти там.Просто верните элемент с undefined (или любым другим значением) в качестве статуса, если в массиве applied_status нет совпадений:

schools = [{name: 'school 1', id: 1, address: 'address'}, {name: 'school 2', id: 2, address: 'address'}, {name: 'school 3', id: 3, address: 'address'}, {name: 'school 4', id: 4, address: 'address'}];

apply_status = [{user_name: 'name', school_id: 1, applied_status: 'pending' }, {user_name: 'name', school_id: 2, applied_status: 'accepted'}, {user_name: 'name', school_id: 4, applied_status: 'accepted'}];

const results = schools.map(school => {
  const applyStatus = apply_status.find(status => status.school_id === school.id);
  return {
    ...school,
    status: applyStatus ? applyStatus.applied_status : undefined
  };
});
console.log(results);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...