Работа с вложенными объектами в Javascript-Не совсем понятная концепция

#javascript #arrays #foreach #nested

Вопрос:

Все еще учусь здесь. Этот, каким бы простым он ни казался, избил меня. Мне удалось получить ответ. Но когда я это делаю, я получаю более одного имени, выходящего из моего заявления if. Я использовал новый набор, чтобы удалить дубликаты имен в массиве имен. Но, честно говоря, мне это кажется ленивым, и я чувствую, что можно сделать что-то лучше.

Может ли кто-нибудь показать мне некоторые способы, которых мне не хватает, чтобы лучше справиться с этой проблемой? Я попробовал выровнять, и это тоже не сработало. Спасибо вам за вашу помощь!

Вот указания, данные мне: Создайте функцию passingStudents , которая принимает массив объектов учащихся. Он должен выполнить итерацию по списку учащихся и вернуть массив имен всех учащихся, средний балл которых составляет не менее 70.

 function passingStudents(students) {
  const names = [];
    students.forEach(student => {
        student.grades.forEach(grade => {
      if(grade.score >= 70) {
        names.push(student.name);
      }
    });
  });
  
  let uniqueChars = [...new Set(names)];
  

  return uniqueChars;
}


//Uncomment the lines below to test your function:

var students = [
  {
    "name": "Marco",
    "id": 12345,
    "grades": [{"id": 0, "score": 65}, {"id": 1, "score": 75}, {"id": 2, "score": 85}]
  },
  {
    "name": "Donna",
    "id": 55555,
    "grades": [{"id": 0, "score": 100}, {"id": 1, "score": 100}, {"id": 2, "score": 100}]
  },
  {
    "name": "Jukay",
    "id": 94110,
    "grades": [{"id": 0, "score": 65}, {"id": 1, "score": 60}, {"id": 2, "score": 65}]
  }
];

console.log(passingStudents(students)); // => [ 'Marco', 'Donna' ]
 

Комментарии:

1. Ленивый-это просто прекрасно (и даже предпочтительнее) в программировании, если он работает, доступен для обслуживания и не слишком неэффективен.

Ответ №1:

Причина, по которой ваше решение вводит несколько человек в массив имен, заключается в том, что оно добавляет имя для каждой их оценки, которая составляет не менее 70. Это означает, что он вернет ученика, если какой-либо из его оценок составляет не менее 70, а не если их средний балл составляет не менее 70. Хотя ваше решение может пройти предоставленный тестовый случай, оно не будет работать для каждого случая в целом. Лучшим решением является усреднение оценок с помощью сокращения и фильтрации исходного списка учащихся на основе того, превышает ли их средний балл 70. Затем вы можете сопоставить отфильтрованных студентов с их именами.

 function passingStudents(students) {
    return students
        .filter((student) => {
            const { grades } = student;
            const average = grades.reduce((sum, grade) => sum   grade.score, 0) / grades.length;
            return average >= 70;
        })
        .map((student) => student.name);
}