如果联系人中的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));
});
答案 0 :(得分:2)
filter()
方法将创建一个新数组,其中包含所有通过提供的功能实现的测试的元素。
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
。
由于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是键,而contact是值。这将具有相似的查找速度(大约为O(1)
)。