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

时间:2018-11-12 04:31:24

标签: javascript arrays typescript object angular6

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

2 个答案:

答案 0 :(得分:2)

您可以使用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);

答案 1 :(得分:2)

就性能而言,最好在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))。