【问题标题】:Dealing with Nested Objects in Javascript -- Not totally Understanding Concept在 Javascript 中处理嵌套对象——不完全理解概念
【发布时间】:2021-08-12 00:29:06
【问题描述】:

还是在这里学习。这个看起来很简单,已经打败了我。我设法得到了答案。但是,当我这样做时,我会从我的 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' ]

【问题讨论】:

  • Lazy 在编程中很好(甚至更可取),如果它可以工作、可维护并且不会太低效。

标签: javascript arrays foreach nested


【解决方案1】:

您的解决方案在名称数组中引入多个人的原因是,它为他们至少 70 分的每个年级添加了姓名。这意味着如果他们的成绩有任何,它将返回一个学生至少是 70,而不是如果他们的 平均 成绩至少是 70。虽然您的解决方案可能会通过提供的测试用例,但它通常不适用于每种情况。更好的解决方案是使用 reduce 来平均成绩,并根据学生的平均分是否高于 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);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多