С точки зрения производительности, было бы лучше выполнить итерации по 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)
).