这是一个新问题,因为关于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:513bd489b0e7e2634b60dc47, 名称:' Visual Sump Inspection UST-22C NC', 类型:'服务' }
它正在记录可用属性,但不记录在对象中,为什么会这样?
答案 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
因此,当显式读取时,所有三个属性都会显示,但是当记录整个对象时,不会枚举b
和c
。