#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);
}