使用以下代码:
req.Course.find({}).populate('students', 'username firstName lastName registered').populate('teacher', 'image mID firstName lastName').sort({title: 1}).exec(function(err, courses){
if(err) throw err;
req.toJade.courses = [];
if (courses){
req.toJade.courses = advs;
}
res.render('courses/list', req.toJade);
});
courses
是以下格式的对象数组:
[{
_id: objectid,
title: 'History',
teacher:
{
_id: objectid,
name: 'John Smith',
etc...
},
etc...
},
etc...
]
当我尝试使用
访问任何教师的属性时,我在Jade中遍历这些对象的数组for c in courses:
h1= c.title
small= c.teacher.name
它返回一个错误,它无法读取属性' name'未定义的。当我尝试访问课程对象的任何其他属性时会发生这种情况。
然而,使用
for c in courses:
h1= c.title
small= c.teacher
打印出整个明确定义的对象,其所有属性都存在且具有正确的值。
我做错了什么以及如何访问教师对象的任何属性?
答案 0 :(得分:2)
java脚本只有在我们访问它时才会检查特定对象的属性是否存在。因为它不是C#,Java等类型语言。在java脚本中,我们可以动态添加或删除属性。
要检查对象中是否存在属性,我们可以使用javascript中所有对象可用的函数。
的 objectname.hasOwnProperty(" propertyToCheck&#34)强>
答案 1 :(得分:2)
for..in
遍历对象的所有属性。在Arrays的情况下,这意味着它的所有值,在数组本身上设置的所有属性以及在Array.prototype
上设置的所有属性。通常在处理数组时,您只对值感兴趣,因此for..in
不是最佳选择。
迭代数组值的正确方法是使用简单的for/while/do while
或使用Array#forEach
和其他类似的函数迭代方法:
for (var i=0; i<courses.length; i++) {
var c = courses[i];
h1 = c.title;
small = c.teacher.name;
}
// or
courses.forEach(function(c){
h1 = c.title;
small = c.teacher.name;
});
此外,如果未设置教师属性,则避免错误的一种简单方法是:
small = c.teacher && c.teacher.name;
如果c.teacher
为undefined
,则small
也为undefined
,否则等于c.teacher.name
。
添加默认值同样简单:
small = c.teacher && c.teacher.name || 'Unknown teacher';
答案 2 :(得分:1)
我发现了我的愚蠢错误。我没想到在课程数组中有两个对象让他们的老师不明确。我想这打破了整个事情,因为我从未检查过教师的财产是否存在。