Javascript对象中的数组属性未定义

Yu *_*hen 5 javascript mongoose node.js

我正在使用Node.js遍历Artist从Mongoose获得的一系列结果:

User.find({UserType: "Artist"}, '_id Firstname BIO list_artworks').then((artists) =>{
    for (var i=0; i < artists.length; i++){
        console.log(artists[i]);
    }
})
Run Code Online (Sandbox Code Playgroud)

上面的代码可以找到并打印出Artists我要求的所有三个属性。

编辑:这是我在控制台中看到的示例:

{
    _id: 'T8fdSmf0e1ua',
    BIO: 'This is Susan's bio...\n',
    Firstname: 'Susan',
    list_artworks: [
        'ID ONE',
        'ID TWO', 
        ...
    ]
}
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试访问包含ArtworkID 数组的属性时,使用console.log()以下命令无法定义所有内容:

for (var i=0; i < artists.length; i++){
    console.log(artists[i].list_artworks);
}
Run Code Online (Sandbox Code Playgroud)

当我访问Artist的其他属性(例如BIO或)时Firstname,它会成功打印到控制台上:

for (var i=0; i < artists.length; i++){
    console.log(artists[i].BIO);
}
Run Code Online (Sandbox Code Playgroud)

为什么会这样呢?考虑到所有对象都在then()链中返回,在这种情况下,我认为这与异步代码无关。list_artworks如果我打印整个artist对象,该属性显然就在那里,但是为什么当我尝试访问它时却未定义它?

这是另一个例子。我先打印每个属性,然后再打印对象本身:

console.log(artist.BIO);
console.log("---------------")
console.log(artist.Firstname);
console.log("---------------")
console.log(artist.list_artworks);
console.log("---------------")
console.log(artist)
Run Code Online (Sandbox Code Playgroud)

这是我的控制台上打印的内容:

User.find({UserType: "Artist"}, '_id Firstname BIO list_artworks').then((artists) =>{
    for (var i=0; i < artists.length; i++){
        console.log(artists[i]);
    }
})
Run Code Online (Sandbox Code Playgroud)

这是我的整个代码库:

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);
Run Code Online (Sandbox Code Playgroud)

And*_*ell 5

致电toObject艺术家:

artist = artists[i].toObject();
Run Code Online (Sandbox Code Playgroud)