Javascript-Node.js-Express-MongoDB-猫鼬
我有一个forEach()方法,在每个用户添加/删除数组中的项目时运行for循环。它成功为一个用户添加了适当数量的项目,但没有添加其余项目。如何将taskList.title'undefined'保留在数组中的项目?
User.find({}, function(err, allUsers){
if(err){
console.log(err);
} else {
console.log("Total Users: ", Number(allUsers.length));
console.log("Users are: ", allUsers);
Task.find({}, function(err, taskList){
if(err){
console.log(err);
} else {
console.log("Your task list: " , taskList);
console.log("First item: " , taskList[0].title);
let n = (Math.floor(Number(taskList.length) / Number(allUsers.length)));
console.log("Users have", n , "items.");
console.log("===============================");
//assign n items to each user
//line 151
allUsers.forEach(function addItem(user){
for(var i = 0; i < n; i++){
user.items.push(taskList[i].title);
taskList.splice(i,1);
console.log('item added!');
console.log(user.name+":", user.items);
console.log(taskList.length , "items remain.";
}
});
}
});
}
});
events.js:160
throw er; // Unhandled 'error' event
^
TypeError: Cannot read property 'title' of undefined
at addItem (/home/ubuntu/workspace/v1.4/app.js:151:56)
at Array.forEach (native)
at /home/ubuntu/workspace/v1.4/app.js:149:30
at /home/ubuntu/workspace/v1.4/node_modules/mongoose/lib/model.js:4485:16
at process.nextTick (/home/ubuntu/workspace/v1.4/node_modules/mongoose/lib/helpers/query/completeMany.js:35:39)
at _combinedTickCallback (internal/process/next_tick.js:73:7)
at process._tickCallback (internal/process/next_tick.js:104:9)
最佳答案
当您使用TaskList.splice(i,1)时,您正在更新TaskList数组的长度,但是for循环不引用TaskList.length。您正在使用n中的缓存值,该值是原始TaskList.length值。
您将不需要使用拼接或使用其他循环方法。也许使用Array.prototype.shift的东西
var task;
while(task = TaskList.shift()) {
...
}