Получить объекты в массиве, если свойство соответствует другому массиву - PullRequest
0 голосов
/ 12 ноября 2018

Я хочу создать новый массив, содержащий контактные объекты, если свойство значения в контактах соответствует значениям в selectedContact. Есть ли более простой способ сделать это?

selectedContact: number[] = [0,2] //value
contacts: Contact[] = [{ 
  firstName:"Dan";
  lastName:"Chong";
  email:"danc@mail.com";
  value:0;
},
{ 
  firstName:"Mark";
  lastName:"Wong";
  email:"markw@mail.com";
  value:1;
},
{ 
  firstName:"Layla";
  lastName:"Sng";
  email:"layla@mail.com";
  value: 2;
}]

Предполагаемый конечный результат:

newArray = [{ 
 firstName:"Dan";
 lastName:"Chong";
 email:"danc@mail.com";
 value:0;
},{ 
 firstName:"Layla";
 lastName:"Sng";
 email:"layla@mail.com";
 value:2;
}];

Мое текущее решение:

const newArray: Contact[] = [];
this.selectedContact.forEach(index => {
  newArray.push(this.contacts.find(c => c.value === index));
});

Ответы [ 2 ]

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

С точки зрения производительности, было бы лучше выполнить итерации по selectedContacts, а не contacts, тем более что contacts проиндексированы (как массив), и вы выбираете по индексу.

Скажем, длина contacts равна N, а длина selectedContacts равна M.

Поскольку selectedContacts является подмножеством contacts, мы знаем M <= N.Для больших баз данных контактов это различие может быть значительным.

Код в вопросе:

this.selectedContact.forEach(index => {
  newArray.push(this.contacts.find(c => c.value === index));
});

Имеет O(M*N), поскольку он повторяется по selectedContact O(M) и на каждомитерация находит значение в contacts (O(N)).

Код из принятого ответа перебирает contact (O(N)) и ищет значение в selectedContact, равное O(M).Это делает алгоритм эквивалентным: O(N*M)

В вашем примере у вас уже есть дешевый способ поиска контактов по номеру, поскольку contacts - это массив, а ваши индексы - это просто индекс в массиве.

Это означает, что вы можете использовать такой код:

return this.selectedContact.map(index => this.contacts[index]);

Поскольку доступ к элементу массива по индексу имеет O(1), он будет иметь O(M), что является наименьшим из размеров.

Если вы не можете использовать индекс массива в качестве ключа, вы можете использовать другие структуры данных, например Map, где id - это ключ, а контакт - это значение.Это будет иметь аналогичные скорости поиска (примерно O(1)).

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

Вы можете использовать Array.prototype.filter ()

Метод filter() создает новый массив со всеми элементами, которые проходят тест, реализованный предоставленной функцией.

и Array.prototype.includes ()

Метод include () определяет, содержит ли массив определенный элемент, возвращая, в зависимости от ситуации, true или false.

Пример рабочего кода:

var selectedContact = [0,2];
var contacts = [{ 
  firstName: "Dan",
  lastName: "Chong",
  email: "danc@mail.com",
  value: 0
},
{ 
  firstName: "Mark",
  lastName: "Wong",
  email: "markw@mail.com",
  value: 1
},
{ 
  firstName: "Layla",
  lastName: "Sng",
  email: "layla@mail.com",
  value: 2
}]
let newArray =  contacts.filter(c => selectedContact.includes(c.value));

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