最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

javascript - Loop through Mongoose objects - Stack Overflow

programmeradmin1浏览0评论

I have a Mongoose result object that I'd like to loop through, but it seems to behave differently than a classic object.

Usually, you can't loop through nonenumerable properties with for…in loop, but that seems to work here. Hence, that doesn't work with Object.keys though it's supposed to loop through the same properties as for…in

Furthermore, Object.getOwnPropertyNames(obj) which is supposed to loop through every properties (enumerable or not) doesn't return any of the fetched values. I don't really get what's happening here.

Here is some sample code and its output to illustrate this:

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");
    }
});

This it the output in the console:

{ _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' },
  ments: [] }

 --- 

[ '$__',
  '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

ments -- 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

In the end, I'd like to loop through media.audio but I can't figure out how.

It works by doing var audio = (JSON.parse(JSON.stringify(media.audio))); and then loop through it with a for…in, but I don't find this to be the proper way of doing it!

I have a Mongoose result object that I'd like to loop through, but it seems to behave differently than a classic object.

Usually, you can't loop through nonenumerable properties with for…in loop, but that seems to work here. Hence, that doesn't work with Object.keys though it's supposed to loop through the same properties as for…in

Furthermore, Object.getOwnPropertyNames(obj) which is supposed to loop through every properties (enumerable or not) doesn't return any of the fetched values. I don't really get what's happening here.

Here is some sample code and its output to illustrate this:

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");
    }
});

This it the output in the console:

{ _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' },
  ments: [] }

 --- 

[ '$__',
  '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

ments -- 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

In the end, I'd like to loop through media.audio but I can't figure out how.

It works by doing var audio = (JSON.parse(JSON.stringify(media.audio))); and then loop through it with a for…in, but I don't find this to be the proper way of doing it!

Share Improve this question edited Aug 8, 2015 at 6:20 Buzut asked Aug 8, 2015 at 6:12 BuzutBuzut 5,1834 gold badges51 silver badges56 bronze badges 5
  • 1 DId you try loop through media.audio.toObject() object? – Artem Baranovskii Commented Aug 8, 2015 at 9:34
  • That works perfectly! There's actually a SO post that explains just that. – Buzut Commented Aug 8, 2015 at 12:36
  • Nevertheless, how is that I get nonenumerable properties with for…in, as media is still a JS object? – Buzut Commented Aug 8, 2015 at 12:38
  • 1 Does this help you stackoverflow./questions/8024149/… ? – Artem Baranovskii Commented Aug 8, 2015 at 15:59
  • There's also a quite good synthesis on MDN – Buzut Commented Aug 8, 2015 at 17:23
Add a ment  | 

2 Answers 2

Reset to default 7

Well, question is not fresh, but this situation may still bee a piece of pain. You may use toJSON or toObject method to get normal, iterable object. Just like this:

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

See this post for details about toJSON an toObject

I think you can do it with:

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'
    },
    ments: []
};

for (var property in media.audio) {
    if (media.audio.hasOwnProperty(property)) {
        console.log(property);
    }
}
发布评论

评论列表(0)

  1. 暂无评论