将一个对象数组中的属性的值映射到另一个对象数组Javascript中的属性

问题描述 投票:1回答:2

我有两个对象数组:

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

请帮忙。

javascript arrays javascript-objects
2个回答
2
投票

您不能使用.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);

1
投票
courses.filter(course => sectionCourses.find(section => +section.courseId === +course._id))

请注意我在courseId_id属性之前如何使用+运算符。这会自动将String类型的数字转换为数字。例如

+"1" = 1
+1 = 1

这对于使用===时的轻微比较问题非常有用

注意Array.find()不适用于IE

© www.soinside.com 2019 - 2024. All rights reserved.