Javascript对象中的数组属性是未定义的
我使用Node.js来循环访问从Mongoose获得的Artist
结果数组:
User.find({UserType: "Artist"}, '_id Firstname BIO list_artworks').then((artists) =>{ for (var i=0; i < artists.length; i++){ console.log(artists[i]); } })
上面的代码可以find并打印出我要求的Artists
所有三个属性。
编辑:这里是我在控制台中看到的一个例子:
{ _id: 'T8fdSmf0e1ua', BIO: 'This is Susan's bio...\n', Firstname: 'Susan', list_artworks: [ 'ID ONE', 'ID TWO', ... ] }
但是,当我尝试访问属性是一个Artwork
ID的数组,一切都是未定义使用console.log()
:
for (var i=0; i < artists.length; i++){ console.log(artists[i].list_artworks); }
当我访问我的艺术家的其他属性,如BIO
或Firstname
,它成功打印到我的控制台:
for (var i=0; i < artists.length; i++){ console.log(artists[i].BIO); }
这是为什么? 在这种情况下,我不认为它与asynchronous代码有关,因为所有的对象都是在then()
链中返回的。 如果我打印整个artist
对象,那么list_artworks
属性显然存在,但是为什么当我尝试访问它时未定义呢?
这是另一个例子。 我打印出每个属性,然后打印对象本身:
console.log(artist.BIO); console.log("---------------") console.log(artist.Firstname); console.log("---------------") console.log(artist.list_artworks); console.log("---------------") console.log(artist)
以下是我的控制台上打印的内容:
--------------- Mike --------------- undefined // <--- when I access the property itself --------------- { _id: '599asdsdasd232d23d2', Firstname: 'Mike', BIO: '', list_artworks: // <-- why does it show up here? [ '6cohpx7d23asu', 'W4Fgs23X5aXds',...
这是我的整个代码库:
setTimeout(function(){ User.find({UserType: "Artist"}, '_id Firstname BIO list_artworks').then((artists) =>{ console.log(artists.length); for (var i=0; i < artists.length; i++){ artist = artists[i]; console.log(artist.BIO); console.log("---------------") console.log(artist.Firstname); console.log("---------------") console.log(artist['list_artworks']); console.log("---------------") console.log(artist) } } ).catch((err)=>{console.log(err)}); }, constants.NLP_TRAINING_INTERVAL);
调用艺术家的toObject
:
artist = artists[i].toObject();
尝试这个
User.find({UserType: "Artist"}, '_id Firstname BIO list_artworks').then((artists) =>{ for (var i=0; i < artists.length; i++){ console.log(artists[i]['list_artworks']); } }
尝试这个:
User.find({UserType: "Artist"}, '_id Firstname BIOlist_artworks').then((artists) =>{ var index = i.toString(); console.log(artists[index]['list_artworks']); } }