Javascript:将对象从foreach推送到数组

时间:2017-11-24 22:40:25

标签: javascript arrays foreach

我想根据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属性,我想插入整个对象。

我已经用尽了有限的理解力。有谁可以指出这个问题?

1 个答案:

答案 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