2012-03-08 66 views
5

我得到的结果(对象)从猫鼬查询回来,要替换/删除一些按键,之前我字符串化的对象,并将其发送给客户端。如何检查/迭代节点中的对象?

当我CONSOLE.LOG对象,一切都很好(所有键都列出来,仅此而已)。当我在对象上做一个for..in时,隐藏的字段会出现在任何地方(以及感兴趣的键,请不要)。他们有道理 - 他们属于猫鼬 - 但我不想要他们。在对象 - 隐藏字段弹出窗口中使用Object.keys或Object.getOwnPropertyNames时,同样的事情发生,没有用处。

所以我想与util.inspect检查元素(OBJ,真实,空,真)并记录结果到控制台。控制台上的结果是一样的,就好像我将console.log直接对象没有检查。

现在,两个问题;

  1. 如何正确检查一个对象,以便实际获取有关该对象的内部/隐藏信息?
  2. 我如何可以遍历对象,只能获得场? (是的,我做的for..in循环中的hasOwnProperty检查)

//编辑

OK,我知道了。经过一番调查后,我意识到,猫鼬对象代理的性质,以及具有一个功能的toJSON,这解释了为什么console.logs是在预期的输出结构。解决方案是使用Mongoose自己的toObject方法;

mongooseObj.toObject({ getters: true, virtuals: false }) 

这样一来,我可以遍历Object.getOwnPropertyNames和替换/删除键我不想让客户知道!

+0

你能改写一下你的问题吗?我很难理解你在问什么。 '隐藏领域'是什么意思?原型链上的属性是否更高?标记为不可枚举的属性?或以_underscore开头的属性? – 2012-03-09 00:03:16

回答

4

我要猜你正在寻找一个猫鼬查询返回的文档对象当你真的只是想看到的数据。如果我的猜测是正确的,你可能会想是这样的:

Model.findOne({ name: 'john' }, function (err, doc) { 
    var data = doc.toObject(); 

    // do whatever you need to with data 
    delete data.age; 
    delete data.weight; 
    data.isAwesome = true; 

    // now stringify the data and do something with it 
    callback(JSON.stringify(data)); 
}); 
+1

嗨abe,谢谢你的回答。我实际上刚刚看到,你的答案中有toObject ..应该从一开始就看到了;)感谢您的帮助! – japrescott 2012-03-10 11:44:14

0

此外,如果你想从文档访问某一领域你可以看看:

Document#get

// path 
doc.get('age') // 47 

// dynamic casting to a string 
doc.get('age', String) // "47"