【问题标题】:Array property in Javascript object is undefinedJavascript 对象中的数组属性未定义
【发布时间】:2017-12-12 19:28:00
【问题描述】:

我正在使用 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]);
    }
})

上面的代码可以找到并打印出我要求的 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);
}

当我访问我的 Artist 的其他属性时,例如 BIOFirstname,它会成功打印到我的控制台:

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

为什么会这样?我认为在这种情况下它与异步代码无关,因为所有对象都返回到 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);

【问题讨论】:

  • 您确定您从 MongoDB 获取的所有对象都有 list_artworks 键吗?
  • @SeanParsons 是的。我编辑了我的问题以包含我的 console.log。我的沙盒数据库中只有三个 Artists 对象,它们都有那个键。
  • 奇怪的是输出以---------- 开头,因为这不是您打印的第一件事......
  • @trincot 那是因为 Mike 的 BIO 是空的,所以它确实打印了那行。就在 StackOverflow 格式化我的输出时,它会切断该文本,因为它是空的。
  • 是否有任何其他代码可以稍后添加list_artwork 属性?

标签: javascript node.js mongoose


【解决方案1】:

请致电toObject 联系艺术家:

artist = artists[i].toObject();

【讨论】:

  • 这行得通!谢谢!我查看了 toObject() 的文档,但仍然不完全确定为什么会这样 - 不是调用艺术家 [i] 只是返回数组的第 i 个元素(一个对象)吗?
  • artists[i] 是猫鼬文档,不是普通的JS对象;调用toObject 将文档转换为对象。
【解决方案2】:

试试这个:

User.find({UserType: "Artist"}, '_id Firstname BIOlist_artworks').then((artists) =>{
             var index = i.toString();
            console.log(artists[index][‘list_artworks’]);
        }
   }

【讨论】:

  • 这也返回 undefined。
【解决方案3】:

试试这个

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’]);
        }
         }

【讨论】:

  • 如果你看我的问题,我就是这样做的,它返回 undefined。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-08
  • 2018-07-20
  • 1970-01-01
相关资源
最近更新 更多