我有以下代码:
app.get('/api/getSubRooms/:id', function(req, res, next) {
var rooms = [];
Room.findById(req.params.id, function(err, room) {
if (err) throw err;
var rootRoom = room;
console.log("Subrooms: " + rootRoom.subrooms);
for (var subroom in rootRoom.subrooms) {
Room.findById(subroom, function(err, room) {
if (err) throw err;
rooms.push(room);
if (rooms.length === rootRoom.subrooms.length) res.send(rooms);
});
}
});
});
现在数组rootRoom.subrooms包含来自MongoDB的ObjectID,但是for-in循环给我0作为第一个成员,尽管这个成员显然不存在于数组中,如console.log所示。当我使用传统的for循环时:
for (var i=0; i<rootRoom.subrooms.length; ++i) {
Room.findById(rootRoom.subrooms[i], function(err, room) {
if (err) throw err;
rooms.push(room);
if (rooms.length === rootRoom.subrooms.length) res.send(rooms);
});
一切都按预期工作。任何人都知道为什么会这样?
答案 0 :(得分:0)
来自MDN docs:
数组索引只是具有整数名称的可枚举属性 否则与一般对象属性相同。没有 保证for ... in将返回任何特定的索引 order,它将返回所有可枚举的属性,包括那些 使用非整数名称和继承的名称。
这个0成员可能来自原型链上的不同可枚举属性。