我想根据ID来从数组中提取对象的集合。我正在使用vanilla Javascript。
contacts = [
{ID: 1, firstName: "Aaron", lastName: "Smith"},
{ID: 2, firstName: "Ben", lastName: "Smith"},
{ID: 3, firstName: "Conrad", lastName: "Smith"}
];
filteredContactIds = [1, 3];
filteredContacts = [];
filteredContactIds.forEach(function (filteredId) {
filteredContacts.push(
contacts.forEach(function (contact) {
if (contact.ID == filteredId) {
return contact;
}
})
)
});
简化了Contacts和filteredContactIds,在我的代码中,两个数组都正确填充。问题是,filteredContacts数组只接收每个联系对象的ID属性,我想插入整个对象。
我已经用尽了有限的理解力。有谁可以指出这个问题?
答案 0 :(得分:5)
您的方法存在的问题是Array#forEach
没有返回值。它只对数组中的每个项执行一些操作。这意味着undefined
被推送到filteredContacts
。您可以使用contacts.filter
,但可以删除内循环。
使用Array#filter
和数组包含检查:
const contacts = [
{ID: 1, firstName: "Aaron", lastName: "Smith"},
{ID: 2, firstName: "Ben", lastName: "Smith"},
{ID: 3, firstName: "Conrad", lastName: "Smith"}
];
const filteredContactIds = [1, 3];
const filteredContacts = contacts.filter(({ ID }) => filteredContactIds.includes(ID));
console.log(filteredContacts);
而不是必须有两个循环,一个单独的contacts
数组运行将起作用。这将遍历数组并检查当前联系人的ID是否在filteredContactIds
数组内,从而删除另一个循环。这是ES5及以下版本的脱落版本:
var contacts = [
{ID: 1, firstName: "Aaron", lastName: "Smith"},
{ID: 2, firstName: "Ben", lastName: "Smith"},
{ID: 3, firstName: "Conrad", lastName: "Smith"}
];
var filteredContactIds = [1, 3];
var filteredContacts = contacts.filter(function(contact) {
return filteredContactIds.indexOf(contact.ID) > -1;
});
console.log(filteredContacts);
而不是Array#includes
,它使用Array#indexOf
,不使用对象解构,也不使用箭头函数,也不使用const
。