Javascript: 在foreach循环中将对象添加到数组

3
我想基于ID从一个数组中提取一组对象。我正在使用纯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个回答

6
你的方法存在问题,因为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#indexOf而不是Array#includes,并且不使用对象解构、箭头函数或const


1
if es6 is available. - Nina Scholz
@NinaScholz 是的。我包含了一个去糖化版本。 - Andrew Li
在es5中不支持箭头函数或const - charlietfl
@charlietfl 完成。 - Andrew Li
解决方案 <= ES5非常好用,唯一需要做的就是在-1后面删除右括号。由于来自C#背景,对于forEach接受可调用参数感到困惑,这就是为什么我认为可调用需要返回联系人的原因。 - Ben E.
@BenE。感谢你的发现!函数式JS可能需要一些时间来理解,但在这种情况下非常有用。我建议查看MDN。它是ES5及更高版本文档的最可靠和完整的来源。 - Andrew Li

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接