javascript - 如果属性与另一个数组匹配,则检索数组中的对象

标签 javascript arrays typescript object angular6

如果联系人中的值属性与 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));
});

最佳答案

在性能方面,迭代selectedContacts会更好而不是 contacts ,特别是因为contacts被索引(作为一个数组)并且您正在通过索引进行选择。

说出contacts的长度是NselectedContacts 的长度是M .

selectedContactscontacts 的子集,我们知道 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 是键,contact 是值。这将具有相似的查找速度(大约为 O(1) )。

关于javascript - 如果属性与另一个数组匹配,则检索数组中的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53255988/

相关文章:

javascript - 在 ng-repeat、Angular 中使用单选按钮

javascript - 在 JavaScript 中创建对象的更好方法是什么?

javascript - L is not defined 错误与传单

Ruby:如何将数组的元素与前缀连接在一起?

python - Python 中 Bytearray 和 List 的区别

typescript - 如何为 some()、filter()、forEach() 禁用@typescript-eslint/explicit-function-return-type?

javascript - 第一个轮播括号第二个 "owl-carousel"

Javascript 按其他数组的顺序排序

javascript - 使用 RXJS 进行搜索输入,该输入进行 API 调用,但订阅会重复发生,即使使用 debounceTime

Angular 5 - 使用模板驱动表单的动态表单验证