如何遍历动态键名对象,筛选成绩合格的学生姓名列表
解决方案
可以通过以下几种常用方法实现需求,核心思路是遍历对象的所有值(或键值对),筛选出成绩合格的学生后提取姓名:
方法1:Object.values() + filter() + map()(简洁函数式写法)
直接获取对象的所有值,过滤出result为pass的项,再映射提取学生姓名:
const schoolObj = { class10: { studentName: 'John', result: 'pass' }, class11: { studentName: 'Alis', result: 'pass' }, class12: { studentName: 'Nick', result: 'fail' }, }; const students = Object.values(schoolObj) .filter(item => item.result === 'pass') .map(item => item.studentName); console.log(students); // 输出: ['John', 'Alis']
方法2:Object.entries()遍历键值对
如果需要同时访问动态键名(如class10)和对应学生信息,可使用Object.entries()获取键值对数组后处理:
const schoolObj = { class10: { studentName: 'John', result: 'pass' }, class11: { studentName: 'Alis', result: 'pass' }, class12: { studentName: 'Nick', result: 'fail' }, }; const students = []; for (const [className, studentInfo] of Object.entries(schoolObj)) { // 此处可拿到动态键名className if (studentInfo.result === 'pass') { students.push(studentInfo.studentName); } } console.log(students); // 输出: ['John', 'Alis']
方法3:for...in循环(兼容旧环境)
若需兼容ES6之前的环境,for...in是传统的对象键名遍历方式:
const schoolObj = { class10: { studentName: 'John', result: 'pass' }, class11: { studentName: 'Alis', result: 'pass' }, class12: { studentName: 'Nick', result: 'fail' }, }; const students = []; for (const className in schoolObj) { // 加hasOwnProperty判断,避免遍历原型链上的属性 if (schoolObj.hasOwnProperty(className)) { const studentInfo = schoolObj[className]; if (studentInfo.result === 'pass') { students.push(studentInfo.studentName); } } } console.log(students); // 输出: ['John', 'Alis']
注意:原代码中的John、Alis、pass、fail需用引号包裹,否则会被当作未定义变量导致报错。
内容的提问来源于stack exchange,提问作者CBP
相关产品推荐
相关产品推荐

