我有两个对象数组:
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
。
请帮忙。
答案 0 :(得分:2)
您无法使用_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);
<强>演示:强>
{{1}}&#13;
答案 1 :(得分:1)
courses.filter(course => sectionCourses.find(section => +section.courseId === +course._id))
请注意我在courseId
和_id
属性之前使用+运算符。这会自动将String类型的数字转换为数字。
e.g
+"1" = 1
+1 = 1
这对于使用===
注意 Array.find()不适用于IE