为什么只有当我尝试访问其中一个属性时,对象声称是未定义的?

时间:2015-07-10 06:27:54

标签: javascript node.js mongodb mongoose

使用以下代码:

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

打印出整个明确定义的对象,其所有属性都存在且具有正确的值。

我做错了什么以及如何访问教师对象的任何属性?

3 个答案:

答案 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.teacherundefined,则small也为undefined,否则等于c.teacher.name

添加默认值同样简单:

small = c.teacher && c.teacher.name || 'Unknown teacher';

答案 2 :(得分:1)

我发现了我的愚蠢错误。我没想到在课程数组中有两个对象让他们的老师不明确。我想这打破了整个事情,因为我从未检查过教师的财产是否存在。