JavaScript - итерация в таблице, объект которой может иметь 2 имени - PullRequest
0 голосов
/ 09 ноября 2018

У меня есть метод getRelatedContactsIds(relatedContacts), который перебирает таблицу relatedContacts и возвращает contact.id

getRelatedContactsIds(relatedContacts) {
  this.relatedContactsIds = new Set(relatedContacts.map((element) => {
    return element.contact.id
  }))
}

У меня проблема в том, что я не уверен, что объект contact имеет такое имя, объект contact в приведенном выше примере может быть либо contact, либо detail. и поэтому return element.contact.id также может быть return element.detail.id. какой самый чистый способ справиться с этим делом?

Ответы [ 3 ]

0 голосов
/ 09 ноября 2018

Используя деструктуризацию, вы можете сделать что-то вроде этого:

const arr = [{ contact: { id: 1 }},{ detail: { id: 2 }},{ contact: { id: 3 }}];

const ids = arr.map(({ contact: { id: id1 } = {}, detail: { id: id2 } = {} }) => id1 || id2);

console.log(ids);

Надеюсь, это поможет.

0 голосов
/ 09 ноября 2018

Короткая версия:

getRelatedContactsIds(relatedContacts) {
  this.relatedContactsIds = new Set(
    relatedContacts.map(o => (o.contact || o.details).id)
  );
}

Пример кода:

const arr = [{contact: {id: 30}}, {contact: {id: 30}},{details: {id: 20}},{contact: {id: 10}}];
const result = new Set(arr.map(o => (o.contact || o.details).id));

result.forEach(n => console.log(n));
0 голосов
/ 09 ноября 2018

Предполагая, что всегда будет либо contact, либо details, просто выполните проверку для contact. Если он там, верните его id или верните details.id.

getRelatedContactsIds(relatedContacts) {
  this.relatedContactsIds = new Set(relatedContacts.map((element) => {
    return element.contact ? element.contact.id : element.details.id;
  }))
}
...