Фильтр json с множеством и картой, используя вложенные атрибуты - PullRequest
0 голосов
/ 03 марта 2020

Я работаю с некоторыми json, возвращенными через вызов API, и пытаюсь выяснить, возможно ли отфильтровать один json объект на основе значений из другого. Я сталкивался с сетом и картой, которая близка, но не уверен, как обращаться с вложенным атрибутом ... вот упрощенный пример:

var teachers = [
{id: 1, name : 'Bob',studentid: []},
{id: 2, name : 'Sue',studentid: []},
{id: 3, name : 'Jean',studentid: []},
{id: 4, name : 'Jim',studentid: [
    "500zz"
]},
{id: 5, name : 'Paul',studentid: [
    "100zz",
    "120zz",
    "130zz"
]}
];

var students = [
{_id: "100zz", name : 'Betty'},
{_id: "120zz", name : 'Bob'},
{_id: "500zz", name : 'Billy'}
];

console.log(
  teachers.filter(
    (set => item => set.has(item.studentid))(new Set(students.map(item => item._id)))
  )
)

Я хотел бы, чтобы в результат были включены только учителя Джим и Пол (со всеми связанными данными) ... не уверен, что мне нужно добавить или сделать? Множество студентов бросает меня за все oop.

1 Ответ

0 голосов
/ 03 марта 2020
const teachers = [
  { id: 1, name: "Bob", studentid: [] },
  { id: 2, name: "Sue", studentid: [] },
  { id: 3, name: "Jean", studentid: [] },
  { id: 4, name: "Jim", studentid: ["500zz"] },
  { id: 5, name: "Paul", studentid: ["100zz", "120zz", "130zz"] }
];

const students = [
  { _id: "100zz", name: "Betty" },
  { _id: "120zz", name: "Bob" },
  { _id: "500zz", name: "Billy" }
];

// Filter teachers with students greater than 0.
const filtered = teachers.filter(x => x.studentid.length > 0);

// Map teachers with Students
const teachersWithStudents = filtered.map(x => {
  const stu = students
    .map(student => {
      // Determine whether or not teacher 'studentid' contains student '_id'
      const hasStudent = x.studentid.includes(student._id);
      // Teacher has student
      if (hasStudent) {
        return {
          id: student._id,
          name: student.name
        };
      }
      // Teacher does not have student
      return false;
    })
    .filter(x => x); // filter objects that are not false
  // Return teacher object with student (stu) objects
  return {
    ...x,
    studentid: stu
  };
// Return those with matches only
}).filter(x => x.studentid.length > 0);

console.log(teachersWithStudents);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...