如何修复findUnsubmitted函数的对象数组元素筛选错误问题
问题诊断
你的findUnsubmitted函数存在多处逻辑错误,导致结果不符合预期:
- 引用赋值污染原数组:
const unsubmitted = names;直接复用了names数组的引用,后续修改会影响原输入数组,应该创建数组副本。 - 循环逻辑完全错误:
- 遍历names索引时用
date[i]获取提交记录,但date是过滤后的提交数组,长度和names不一致,多数情况会取到undefined。 - 判断条件
student == names.studentName完全无效:names是数组,不存在studentName属性,该条件永远为false。 return unsubmitted写在循环内部,导致循环仅执行一次就直接返回,未完成遍历逻辑。
- 遍历names索引时用
- 操作对象错误:你修改的是全局的
submissions数组,而非要返回的unsubmitted数组,逻辑完全颠倒。
修正后的代码
const submissions = [ { quizName: "Quiz 1", quizModule: "Math", quizScore: 100, studentId: 001, studentName: "Kevin", submissionDate: "March 24, 2022" }, { quizName: "Essay", quizModule: "English", quizScore: 0, studentId: 023, studentName: "Nivek", submissionDate: "April 1, 2022" }, { quizName: "Quiz 2", quizModule: "Science", quizScore: 71.59485, studentId:023, studentName: "John", submissionDate: "May 24, 2022" } ] const filterByDate = (particularDate, submission) => { return submission.filter((sub) => sub.submissionDate === particularDate) } const findUnsubmitted = (particularDate, names, submission) => { // 提取目标日期提交过测验的学生姓名集合 const submittedStudents = filterByDate(particularDate, submission) .map(sub => sub.studentName); // 过滤出未提交的学生 return names.filter(name => !submittedStudents.includes(name)); } console.log(findUnsubmitted('April 1, 2022', ['Kevin', 'Nivek', 'John'], submissions)); // 输出: ['Kevin', 'John']
代码说明
- 获取已提交学生集合:先用
filterByDate筛选目标日期的提交记录,再通过map提取学生姓名,形成已提交名单。 - 过滤未提交学生:用
filter遍历输入的names数组,保留不在已提交名单中的姓名,直接返回结果。 - 避免原数组污染:全程未修改输入的names数组,返回全新数组,符合纯函数特性,同时满足无符合条件学生时返回空数组的需求。
内容的提问来源于stack exchange,提问作者keoe
相关产品推荐
相关产品推荐

