在JavaScript中从数组中获取对象

时间:2018-10-28 11:16:14

标签: javascript

我有一个对象数组(具有studentIDgradedobregisteredDate之类的属性的学生对象)和另一个对象数组(books对象)具有属性studentIDbookIDbookISBN)。

这是一个用于管理小型学校图书馆的Web应用程序。我想做的是,当学生借着studentID 4借书(例如标题为 Welcome Home )时,当您尝试借书时(当然是自图书馆可以有很多存货)给其他人,studentID 4的学生不应出现在有资格获得该书的学生列表中(除非该学生已退还该书)首先)。

booksList数组如下:

[
{
bookEdition: "2nd edition",
bookISBN: 9876533278765,
bookStatus: 0,
bookTitle: "Real Machines",
dateTaken: "2018-10-28",
returnDate: "2018-11-27",
studentID: "0000003"
},

{
bookEdition: "2015 edition",
bookISBN: 9876532226712,
bookStatus: 0,
bookTitle: "Real Machines",
dateTaken: "2018-08-28",
returnDate: "2018-09-27",
studentID: "0000004"
}
];

学生名单如下:

[
{
bio: "Needs extra work. Has problems with mathematics",
birthday: "2005-05-12",
className: "grade 5",
fullname: "Bridget Friday",
gender: "Female",
parentName: "Josam Friday",
studentID: "0000003",
studentStatus: "approved"
}, 

{
bio: "A bit naughty but intelligent. Pay close attention to his diet.",
birthday: "2003-11-07",
className: "grade 6",
fullname: "Charles Ben",
gender: "Male",
parentName: "Chris Ben",
studentID: "0000004",
studentStatus: "approved"
}
];

现在,我正在尝试使用过滤器功能,但没有给我想要的结果。链接两个数组对象及其中的对象的是studentID

我尝试过

var legitStudents = studentsList.filter(el => {
  return !booksList.includes(el.studentID);
});

以上操作无效。数组(studentListbooksList)是动态获取的,我无法确定studentID中有哪些booksList

如何让它按我的意愿工作?

2 个答案:

答案 0 :(得分:1)

return !booksList.includes(el.studentID);

应该是

return !booksList.map(i => i.studentID).includes(el.studentID);

正如几个人在对您的问题的评论中说的那样,问题是您的代码期望booksListstudentID的数组。由于这实际上是学生已经签出的书的列表,因此您首先需要对studentID中所有booksList的数组进行排列,然后可以在结果数组上使用includes。参见map

答案 1 :(得分:1)

您可以使用Rocky Sims的解决方案,也可以尝试

var legitStudents = studentList.filter(student => {
  return !booksList.filter(book => book.studentID === student.studentID).length;
});