繁体   English   中英

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

[英]Retrieve objects in array if property matches another array

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

您可以使用Array.prototype.filter()

filter()方法创建一个新数组,其中所有元素都通过了由提供的函数实现的测试。

Array.prototype.includes()

includes()方法确定数组是否包含某个元素,并在适当时返回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); 

就性能而言,最好在selectedContacts上进行迭代,而不要在contacts上进行迭代,尤其是因为已对contacts索引(作为数组)并且您正在通过索引进行选择。

假设contacts的长度为N ,而selectedContacts的长度为M

由于selectedContactscontacts的子集,因此我们知道M <= N 对于大型的联系人数据库,这种差异可能会很大。

问题中的代码:

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

具有O(M*N)因为它遍历selectedContact O(M)并且在每次迭代时都在contactsO(N) )中找到一个值。

接受的答案中的代码遍历contactO(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) )。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM