Улучшить цикл над вложенными свойствами - JavaScript - PullRequest
0 голосов
/ 26 декабря 2018

Попытка отфильтровать учащихся по значению вложенного свойства.В основном каждый объект учащегося имеет свойство типа array: studentSuperSubject, которое, в свою очередь, также имеет массив как свойство: studentSubSubjectOrSkill subjects - это массив объектов в следующей форме: {superSubject: "some super subject name", subSubject: "some sub subject name"}.каждый subSubject внутри studentSubSubjectOrSkill имеет свойство studentSubSubjectScore, которое я ищу.Я хочу перебрать массив студентов для каждого предмета в subjects и создать и объект, который я затем сохраню в другом массиве - grades=[]

Мне удается это сделать с помощью чего-то похожего на Хью-ору спагеттиcode:

  for (let subject of subjects) {
    var grades = [];
    this.data.students.filter(student => {
      let name = student.studentName;

      // loop over each student > superSubject > subSubject
      for (let superSubject of student.studentSuperSubject) {
        if (superSubject.superSubjectName === subject.superSubject) {
          superSubject.studentSubSubjectOrSkill.filter(sub => {
            if (sub.subSubjectName === subject.subSubject) {
              grades.push({
                name: name,
                pass: sub.studentSubSubjectScore > 58
              });
              return;
            }
          });
        }
      }
    });
    subject["grades"] = grades;
  }

Есть идеи, как мне улучшить это, чтобы облегчить жизнь будущим разработчикам, которые собираются использовать этот код?как примечание, lodash доступен в этом проекте благодаря.

Ответы [ 2 ]

0 голосов
/ 26 декабря 2018

Для удобства чтения я бы проверял одну вещь за раз и добавлял несколько комментариев.

// Iterates for all subjects.
subjects.forEach(subject => {
    // Subject grades.
    subject.grades = [];

    // Iterates for all the students.
    students.forEach(student => {
        // Finds and validates the student super subject.
        var studentSuperSubject = student.studentSuperSubject.find(superSubject => superSubject.superSubjectName === subject.superSubject);
        if (!studentSuperSubject) return;

        // Finds and validates the student sub subject.
        var studentSubSubject = studentSuperSubject.studentSubSubjectOrSkill.find(subSubject => subSubject.subSubjectName == subject.subSubject);
        if (!studentSubSubject) return;

        // Saves the student grade.
        subject.grades.push({
            name: student.studentName,
            pass: studentSubSubject.studentSubSubjectScore > 58
        });
    });
});
0 голосов
/ 26 декабря 2018

1 / Вы неправильно используете фильтр, который следует использовать, когда вы хотите вернуть подмножество массива, вы должны использовать map, когда вы хотите выполнить действие для каждого элемента массива

2 /for ... of ... предназначен для итерации по значениям, for ... in ... по свойствам

3 / Я думаю, что это более читабельно, как это:

for (let subject of subjects) {
    var grades = [];

    this.data.students.map(student => {
      let name = student.studentName;

      student.studentSuperSubject
          .filter(superSubject => superSubject.superSubjectName === subject.superSubject)
          .map(superSubject=> {                     
              superSubject.studentSubSubjectOrSkill
                  .filter(sub => sub.subSubjectName === subject.subSubject)
                  .map(sub=>{
                      grades.push({
                          name: name,
                          pass: sub.studentSubSubjectScore > 58
                      });
                  });
          });
      });

   subject["grades"] = grades;
}
...