如何基于学生数组对象属性创建GPA≥3.5的学生姓名新数组?
问题分析与修正
你的代码存在几个关键错误,导致控制台输出undefined且无法正确筛选出符合条件的学生:
错误访问数组元素属性
你直接使用students.gpa和students.name,但students是整个数组,并非单个学生对象。必须通过索引i访问数组里的具体元素,即students[i](更规范的做法是使用函数参数studentList[i],避免依赖全局变量)。提前return终止函数
return deansList.push(students.name)会在第一次找到符合条件的学生时,直接返回push方法的返回值(数组新长度),同时终止函数,后续学生不会被遍历。而且push的返回值是数字,并非你需要的结果数组。函数未返回最终结果
循环结束后,你没有返回deansList数组,因此调用函数时默认返回undefined。未声明循环变量
i = 0没有用let/var声明,会导致i成为全局变量,属于不良编程习惯。
修正后的代码
const students = [ { name: "Paisley Parker", gpa: 4.0 }, { name: "Lake Herr", gpa: 3.2 }, { name: "Promise Lansing", gpa: 3.9 }, { name: "Friar Park", gpa: 2.8 }, { name: "Mason Amitie", gpa: 3.49 } ] function getDeansList(studentList) { let deansList = []; // 声明局部循环变量i,遍历函数传入的studentList for(let i = 0; i < studentList.length; i++) { const student = studentList[i]; // 提取当前学生对象,提升代码可读性 if(student.gpa >= 3.5) { deansList.push(student.name); // 仅添加姓名,不提前返回 } } return deansList; // 循环结束后返回结果数组 } console.log(getDeansList(students)) // 输出: ["Paisley Parker", "Promise Lansing"]
更简洁的写法(推荐)
针对数组筛选场景,JavaScript的filter+map组合写法更简洁易懂,也能避免手动循环的常见错误:
function getDeansList(studentList) { return studentList .filter(student => student.gpa >= 3.5) // 先筛选GPA符合条件的学生对象 .map(student => student.name); // 再提取这些学生的姓名 }
内容的提问来源于stack exchange,提问作者TPR1999
相关产品推荐
相关产品推荐

