我有一个从mongoDB收到的对象数组。收到“区域”数组后,我想添加一个键到数组中的每个对象。 (添加的键将是日期值的本地化格式,稍后将在呈现HTML页面时使用该日期值。)
// we are inside a express controller for a webapp here
var moment = require('moment');
exports.getAllAreas = function(req, res) {
AreaModel.find().sort('-updatedAt').exec(function(err, allAreas) {
if (err) return next(err);
console.log("area table data:\n%s", JSON.stringify(allAreas, null, ' '));
for (var i = allAreas.length - 1; i >= 0; i--) {
allAreas[i]['createdAt_View'] = moment(allAreas[i].createdAt).format('L');
};
console.log("area table data ###:\n%s", allAreas);
res.json(allAreas);
});
};
来自mongoDB(“allAreas”数组)的数据是:
[
{
"_id": "56f0f7cdd99f646c99ad1e2f",
"updatedAt": "2016-03-19T13:02:19.000Z",
"createdAt": "2016-03-19T13:02:19.000Z",
"description": "Very important topics",
"title": "Another Area"
},
{
"_id": "56f0f7eed99f646c99ad1e30",
"updatedAt": "2016-03-01T13:02:19.000Z",
"createdAt": "2016-01-19T13:02:19.000Z",
"description": "Even more",
"title": "Area2"
}
]
我的问题:在for循环之后,allAreas数组及其内容根本没有改变!
更多旁注: - 我使用(后向)for循环而不是.foreach子句,因为这更快。 - “moment”是一个可以本地化数据值的JS库
mongoDB结果在Javascript中是不可变的吗? 我在这里错过了按值或按引用的内容吗?我只是找不到它。
解决方案(积分来自@RayonDabre)
Mongoose(我使用的OR-mapper)从查询中返回Mongoose Document。因此回调中的变量 allAreas 实际上是一个“更大”的Javascript对象,您不能以这种方式添加属性。
当您向Mongoose Query Builder添加.lean()
时,mongoose会返回一个简单的javascript关联数组,您可以将其添加到。
感谢所有stackoverflow成员帮助这么快!