我有两个对象数组:
courses = [ { _id: 999, courseCode: "Eng1" },
{ _id: 777, courseCode: "Sci1" },
{ _id: 666, courseCode: "Eng2" },
{ _id: 888, courseCode: "Sci2" } ]
sectionCourses = [ { sectionCode: "1A", courseId: "999" },
{ sectionCode: "1A", courseId: "777" },
{ sectionCode: "2A", courseId: "666" },
{ sectionCode: "2A", courseId: "888" } ]
我想以这样一种方式过滤courses
数组,它只包含不属于某个部分的课程。例如,如果我选择sectionCode: "2A"
部分,courses
数组应该只包含
courses = [ { _id: 999, courseCode: "Eng1" },
{ _id: 777, courseCode: "Sci1" },
{ _id: 888, courseCode: "Sci2" } ]
我试着这样做:
courses = courses.filter(c => !(sectionCourses.includes(c._id)))
但我知道这是不完整的,因为我无法弄清楚如何在courseId
访问sectionCourses
。
请帮忙。
您不能使用.includes()
方法通过其_id
查找整个对象,包括比较整个对象而不搜索特定属性。
你可以在这里做的是根据你提供的courseIds
得到一个sectionCode
数组,然后在这个_id
数组中过滤他们的ids
不存在的课程:
function getCourses(catCode) {
var coursesIdstoIgnore = sectionCourses.filter(s => s.sectionCode === catCode).map(s => s.courseId);
return courses.filter(c => coursesIdstoIgnore.indexOf(c["_id"].toString()) == -1);
}
演示:
var courses = [{
_id: 999,
courseCode: "Eng1"
},
{
_id: 777,
courseCode: "Sci1"
},
{
_id: 666,
courseCode: "Eng2"
},
{
_id: 888,
courseCode: "Sci2"
}
];
var sectionCourses = [{
sectionCode: "1A",
courseId: "999"
},
{
sectionCode: "1A",
courseId: "777"
},
{
sectionCode: "2A",
courseId: "666"
},
{
sectionCode: "2A",
courseId: "888"
}
];
function getCourses(catCode) {
var cousesIdstoIgnore = sectionCourses.filter(s => s.sectionCode === catCode).map(s => s.courseId);
console.log(cousesIdstoIgnore);
return courses.filter(c => cousesIdstoIgnore.indexOf(c["_id"].toString()) == -1);
}
var results = getCourses("2A");
console.log(results);
courses.filter(course => sectionCourses.find(section => +section.courseId === +course._id))
请注意我在courseId
和_id
属性之前如何使用+运算符。这会自动将String类型的数字转换为数字。例如
+"1" = 1
+1 = 1
这对于使用===
时的轻微比较问题非常有用
注意Array.find()不适用于IE