筛选指定对象到新数组后打印属性返回undefined问题求助
问题根源与解决方案
首先,咱们来拆解你遇到的undefined问题:核心原因是你声明的student变量从未被赋值为匹配的Jody对象,导致你push到newStudents里的是undefined(var声明的变量默认初始值就是undefined)。之后访问newStudents[0].name,本质是在访问undefined.name,结果自然是undefined。
假设你的完整代码大概是这样的错误版本:
var student; var newStudents = []; var students = [ { name: 'Odelia', track: 'Accounting', achievements: '26', points: '2260' }, { name: 'Jody', track: 'Web Design', achievements: '18', points: '1620' } ]; // 错误的遍历逻辑:没给student赋值 for (var i = 0; i < students.length; i++) { if (students[i].name === 'Jody') { newStudents.push(student); // 这里push的是未赋值的student,即undefined } } console.log(newStudents[0].name); // 返回undefined
正确的写法(仅用var,符合你的要求)
我们只需要在遍历过程中,把匹配到的对象赋值给student,或者直接push目标对象即可:
方式1:使用student变量
var student; var newStudents = []; var students = [ { name: 'Odelia', track: 'Accounting', achievements: '26', points: '2260' }, { name: 'Jody', track: 'Web Design', achievements: '18', points: '1620' } ]; for (var i = 0; i < students.length; i++) { // 先把当前遍历的学生对象赋值给student student = students[i]; if (student.name === 'Jody') { newStudents.push(student); break; // 找到目标后可以终止遍历,提升效率 } } // 安全访问:先判断newStudents[0]是否存在,避免报错 console.log(newStudents[0] ? newStudents[0].name : "未找到匹配的学生");
方式2:直接push目标对象(更简洁)
如果不需要student变量,也可以直接把匹配的元素push进新数组:
var newStudents = []; var students = [ { name: 'Odelia', track: 'Accounting', achievements: '26', points: '2260' }, { name: 'Jody', track: 'Web Design', achievements: '18', points: '1620' } ]; for (var i = 0; i < students.length; i++) { if (students[i].name === 'Jody') { newStudents.push(students[i]); break; } } console.log(newStudents[0].name); // 输出"Jody"
额外注意点
- 确认数组中
name字段的大小写是否和你判断的完全一致(比如不要写成"jody"小写,而数组里是"Jody"); - 如果数组中可能有多个叫Jody的学生,去掉
break即可收集所有匹配项; - 访问
newStudents[0]前最好做存在性判断,避免数组为空时报错。
内容的提问来源于stack exchange,提问作者Yann Bohbot
相关产品推荐
相关产品推荐

