下划线_.each不向对象元素添加属性

时间:2013-10-02 07:46:18

标签: javascript mongoose underscore.js

这是一个新问题,因为关于javascript的一些小事情让我感到困惑。

我有以下代码:

db.units.find({}, { _id: 1, type: 1, name: 1 }).sort({ type: 1, name: 1}).exec(function(err, units) {

  if(err) return next(err);

  _.each(units, function(u, i) {
    this[i]["available"] = !_.contains(_.pluck(_.pluck(req.workorder.units, 'unit'), 'name'), u.name);

    console.log(this[i].available);  
    console.log(this[i]);  
    console.log(_.extend(this[i],{available:this[i].available}));
  }, units); 


  return res.render('workorder/show', {
    workorder: req.workorder,
    invoices: db.invoices.find({ workorders: req.params.id }),
    units: units
  });
});

以下是结果:

真 {_id:513bd​​489b0e7e2634b60dc47,   名称:' Visual Sump Inspection UST-22C NC',   类型:'服务' }

它正在记录可用属性,但不记录在对象中,为什么会这样?

2 个答案:

答案 0 :(得分:1)

问题与猫鼬如何对待对象有关。只能使用document.toObject()

修改对象

http://mongoosejs.com/docs/api.html#document_Document-toObject

Likeso:

  _.each(units, function(u, i) {
    u = _.extend(u.toObject(), {'available': !_.contains(_.pluck(_.pluck(req.workorder.units, 'unit'), 'name'), u.name)});
  }); 

答案 1 :(得分:0)

我怀疑Mongoose正在定义available属性,使其可读但不可枚举。它可以使用getter,也可以通过Object.defineProperty()Object.defineProperties来设置enumerable: false

要进行快速测试,请尝试将此代码粘贴到Chrome控制台或node.js应用中:

var obj = { a: 1 };
Object.defineProperties( obj, {
    b: {
        get: function() {
            return 2;
        }
    },
    c: {
        value: 3,
        enumerable: false
    }
});
console.log( obj );
console.log( obj.a );
console.log( obj.b );
console.log( obj.c );

在Chrome中,代码记录:

Object {a: 1}
1
2
3

因此,当显式读取时,所有三个属性都会显示,但是当记录整个对象时,不会枚举bc