【问题标题】:how to inspect/iterate over an object in node?如何检查/迭代节点中的对象?
【发布时间】:2012-03-26 09:05:49
【问题描述】:

在我将对象字符串化并将其发送给客户端之前,我从 mongoose 查询返回结果(对象)并想要替换/删除一些键。

当我 console.log 对象时,一切都很好(列出了所有键,仅此而已)。当我在对象上执行 for..in 时,隐藏字段会突然弹出(而感兴趣的键,不要)。它们是有道理的——它们属于猫鼬——但我不想要它们。在对象上使用 Object.keys 或 Object.getOwnPropertyNames 时也会发生同样的事情 - 隐藏字段弹出窗口,没有用处。

所以我想用 util.inspect(obj,true,null,true) 检查元素并将结果记录到控制台。控制台上的结果是一样的,就好像我在没有检查的情况下直接 console.logged 对象一样。

现在,两个问题;

  1. 如何正确检查对象,以便真正获得有关该对象的内部/隐藏信息?
  2. 如何遍历对象并仅获取字段? (是的,我正在 for..in 循环中进行 hasOwnProperty 检查)

//编辑

好的,我明白了。经过一番调查,我意识到 mongoose 对象代理了它的属性并且有一个 toJSON 函数,这就解释了为什么 console.logs 在预期的输出结构中。解决方法是使用Mongoose自带的toObject方法;

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

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

【问题讨论】:

  • 你能稍微改一下你的问题吗?我很难理解你在问什么。 “隐藏字段”是什么意思?它只是原型链更高的属性吗?标记为不可枚举的属性?还是以 _underscore 开头的属性?

标签: javascript node.js mongoose ecmascript-harmony


【解决方案1】:

我猜你正在查看 mongoose 查询返回的 Document 对象,而你真的只是想查看数据。如果我的猜测是正确的,你可能会想要这样的东西:

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

【讨论】:

  • 您好,谢谢您的回答。实际上,我现在才看到,您的答案中有 toObject ..应该从一开始就看到了;)感谢您的帮助!
【解决方案2】:

此外,如果您想从 Document 访问某个字段,您可以查看:

Document#get

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

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

【讨论】:

    猜你喜欢
    • 2019-08-15
    • 2018-07-16
    • 2018-01-08
    • 2019-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-02
    相关资源
    最近更新 更多