【问题标题】:Loop through Mongoose objects循环遍历 Mongoose 对象
【发布时间】:2015-10-31 15:17:07
【问题描述】:

我有一个想要循环的 Mongoose 结果对象,但它的行为似乎与经典对象不同。

通常,您不能使用for…in loop 循环遍历不可枚举的属性,但这似乎在这里有效。因此,这不适用于 Object.keys,尽管它应该循环遍历与 for…in 相同的属性……

此外,Object.getOwnPropertyNames(obj) 应该循环遍历每个属性(可枚举或不可枚举)不会返回任何获取的值。我真的不明白这里发生了什么。

这里有一些示例代码及其输出来说明这一点:

MediaModel.findById('558d0b3a5fa02e7e218b470c', function (err, media) {
    if (err) {
        return console.error(err);
    }

    console.log(media);
    console.log("\n --- \n");
    console.log(Object.getOwnPropertyNames(media));
    console.log("\n---\n");

    for (var prop in media) {
        console.log(prop + ' -- Enumerable : ' +   media.propertyIsEnumerable(prop) + ' -- hasOwnProperty : ' + media.hasOwnProperty(prop) + "\n");
    }
});

这是控制台中的输出:

{ _id: 558d0b3a5fa02e7e218b470c,
  name: '54ae5d587860b4.61272171',
  cover: true,
  size: 144,
  audio: 
   { es: '54ae5ec1e31c68.83020900',
     en: '54ae5ec240dd98.65329366',
     fr: '54ae5ec2950737.15028179',
     pt: '54ae5ec2e3bcf5.08479198',
     ar: '54ae5ec33ab8f5.67860635',
     ru: '54ae5ec393d300.66214842' },
  comments: [] }

 --- 

[ '$__',
  'isNew',
  'errors',
  '_doc',
  '$__original_save',
  'save',
  '_pres',
  '_posts' ]

---

$__ -- Enumerable : true -- hasOwnProperty : true

isNew -- Enumerable : true -- hasOwnProperty : true

errors -- Enumerable : true -- hasOwnProperty : true

_doc -- Enumerable : true -- hasOwnProperty : true

$__original_save -- Enumerable : true -- hasOwnProperty : true

save -- Enumerable : true -- hasOwnProperty : true

_pres -- Enumerable : true -- hasOwnProperty : true

_posts -- Enumerable : true -- hasOwnProperty : true

db -- Enumerable : false -- hasOwnProperty : false

discriminators -- Enumerable : false -- hasOwnProperty : false

__v -- Enumerable : false -- hasOwnProperty : false

id -- Enumerable : false -- hasOwnProperty : false

_id -- Enumerable : false -- hasOwnProperty : false

comments -- Enumerable : false -- hasOwnProperty : false

size -- Enumerable : false -- hasOwnProperty : false

length -- Enumerable : false -- hasOwnProperty : false

cover -- Enumerable : false -- hasOwnProperty : false

imdbId -- Enumerable : false -- hasOwnProperty : false

imdbRating -- Enumerable : false -- hasOwnProperty : false

year -- Enumerable : false -- hasOwnProperty : false

actors -- Enumerable : false -- hasOwnProperty : false

writers -- Enumerable : false -- hasOwnProperty : false

director -- Enumerable : false -- hasOwnProperty : false

genre -- Enumerable : false -- hasOwnProperty : false

name -- Enumerable : false -- hasOwnProperty : false

schema -- Enumerable : false -- hasOwnProperty : false

collection -- Enumerable : false -- hasOwnProperty : false

$__handleSave -- Enumerable : false -- hasOwnProperty : false

$__delta -- Enumerable : false -- hasOwnProperty : false

$__version -- Enumerable : false -- hasOwnProperty : false

increment -- Enumerable : false -- hasOwnProperty : false

$__where -- Enumerable : false -- hasOwnProperty : false

remove -- Enumerable : false -- hasOwnProperty : false

model -- Enumerable : false -- hasOwnProperty : false

on -- Enumerable : false -- hasOwnProperty : false

once -- Enumerable : false -- hasOwnProperty : false

emit -- Enumerable : false -- hasOwnProperty : false

listeners -- Enumerable : false -- hasOwnProperty : false

removeListener -- Enumerable : false -- hasOwnProperty : false

setMaxListeners -- Enumerable : false -- hasOwnProperty : false

removeAllListeners -- Enumerable : false -- hasOwnProperty : false

addListener -- Enumerable : false -- hasOwnProperty : false

$__buildDoc -- Enumerable : false -- hasOwnProperty : false

init -- Enumerable : false -- hasOwnProperty : false

$__storeShard -- Enumerable : false -- hasOwnProperty : false

hook -- Enumerable : false -- hasOwnProperty : false

pre -- Enumerable : false -- hasOwnProperty : false

post -- Enumerable : false -- hasOwnProperty : false

removePre -- Enumerable : false -- hasOwnProperty : false

_lazySetupHooks -- Enumerable : false -- hasOwnProperty : false

update -- Enumerable : false -- hasOwnProperty : false

set -- Enumerable : false -- hasOwnProperty : false

$__shouldModify -- Enumerable : false -- hasOwnProperty : false

$__set -- Enumerable : false -- hasOwnProperty : false

getValue -- Enumerable : false -- hasOwnProperty : false

setValue -- Enumerable : false -- hasOwnProperty : false

get -- Enumerable : false -- hasOwnProperty : false

$__path -- Enumerable : false -- hasOwnProperty : false

markModified -- Enumerable : false -- hasOwnProperty : false

modifiedPaths -- Enumerable : false -- hasOwnProperty : false

isModified -- Enumerable : false -- hasOwnProperty : false

isDirectModified -- Enumerable : false -- hasOwnProperty : false

isInit -- Enumerable : false -- hasOwnProperty : false

isSelected -- Enumerable : false -- hasOwnProperty : false

validate -- Enumerable : false -- hasOwnProperty : false

validateSync -- Enumerable : false -- hasOwnProperty : false

invalidate -- Enumerable : false -- hasOwnProperty : false

$markValid -- Enumerable : false -- hasOwnProperty : false

$isValid -- Enumerable : false -- hasOwnProperty : false

$__reset -- Enumerable : false -- hasOwnProperty : false

$__dirty -- Enumerable : false -- hasOwnProperty : false

$__setSchema -- Enumerable : false -- hasOwnProperty : false

$__getArrayPathsToValidate -- Enumerable : false -- hasOwnProperty : false

$__getAllSubdocs -- Enumerable : false -- hasOwnProperty : false

$__registerHooksFromSchema -- Enumerable : false -- hasOwnProperty : false

$__handleReject -- Enumerable : false -- hasOwnProperty : false

$toObject -- Enumerable : false -- hasOwnProperty : false

toObject -- Enumerable : false -- hasOwnProperty : false

toJSON -- Enumerable : false -- hasOwnProperty : false

inspect -- Enumerable : false -- hasOwnProperty : false

toString -- Enumerable : false -- hasOwnProperty : false

equals -- Enumerable : false -- hasOwnProperty : false

populate -- Enumerable : false -- hasOwnProperty : false

execPopulate -- Enumerable : false -- hasOwnProperty : false

populated -- Enumerable : false -- hasOwnProperty : false

$__fullPath -- Enumerable : false -- hasOwnProperty : false

最后,我想遍历media.audio,但我不知道怎么做。

它通过var audio = (JSON.parse(JSON.stringify(media.audio))); 工作,然后用for…in 循环遍历它,但我认为这不是正确的做法!

【问题讨论】:

  • 您尝试循环遍历media.audio.toObject() 对象吗?
  • 效果很好!实际上有一个 SO post 解释了这一点。
  • 尽管如此,for…in 是如何获得不可枚举的属性,因为 media 仍然是一个 JS 对象?
  • 这对您有帮助吗stackoverflow.com/questions/8024149/…
  • MDN上也有相当不错的合成

标签: javascript node.js mongodb loops mongoose


【解决方案1】:

好吧,问题并不新鲜,但这种情况可能仍然会成为一件痛苦的事情。您可以使用toJSONtoObject 方法来获取正常的、可迭代的对象。就像这样:

media = media.toJSON()
Object.keys(media.audio).forEach(...)

有关toJSONtoObject 的详细信息,请参阅this post

【讨论】:

    【解决方案2】:

    我认为你可以这样做:

    var media = {
        _id: '558d0b3a5fa02e7e218b470c',
        name: '54ae5d587860b4.61272171',
        cover: true,
        size: 144,
        audio: {
            es: '54ae5ec1e31c68.83020900',
            en: '54ae5ec240dd98.65329366',
            fr: '54ae5ec2950737.15028179',
            pt: '54ae5ec2e3bcf5.08479198',
            ar: '54ae5ec33ab8f5.67860635',
            ru: '54ae5ec393d300.66214842'
        },
        comments: []
    };
    
    for (var property in media.audio) {
        if (media.audio.hasOwnProperty(property)) {
            console.log(property);
        }
    }
    

    【讨论】:

    • 这是输出:$__ isNew errors _doc $__original_save save _pres _posts name toObject toJSON $__isNested lang __v id _id audio comments size length cover
    • 我试过for…inmediamedia.audio 都不会改变输出......我仍然无法遍历media.audio 对象。
    猜你喜欢
    • 2020-06-09
    • 1970-01-01
    • 2020-04-30
    • 2017-06-12
    • 2014-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多