2015-08-08 2 views
3

У меня есть объект результата Mongoose, который я бы хотел пропустить, но он, похоже, ведет себя иначе, чем классический объект.Loop through Mongoose objects

Как правило, вы не можете прокручивать неисчислимые свойства с помощью 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, но я не считаю, что это правильный способ сделать это!

+1

Пробовали ли вы цикл через 'media.audio.toObject()' объекта? –

+0

Это работает отлично! На самом деле есть [SO post] (http://stackoverflow.com/questions/7503450/how-do-you-turn-a-mongoose-document-into-a-plain-object), который объясняет именно это. – Buzut

+0

Тем не менее, как я могу получить неисчислимые свойства с 'for ... in', поскольку' media' все еще является объектом JS? – Buzut

ответ

2

Ну, вопрос не свежий, но эта ситуация может еще стать частью боли. Вы можете использовать метод toJSON или toObject, чтобы получить нормальный, итерируемый объект. Так же, как это:

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

См this post подробности о toJSONtoObject

0

Я думаю, что вы можете сделать это с:

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); 
    } 
} 
+1

Вот результат: '$ __ isNew ошибки _doc $ __ original_save сохранить _pres _posts имени ToObject toJSON $ __ isNested языков __v идентификатора _id аудио комментариев размера длиной cover' – Buzut

+0

Я пробовал 'for ... in' с' media' и 'media.audio', который не меняет выход ... И я все еще не могу пропустить объект' media.audio'. – Buzut