我正在构建一个简单的待办事项应用程序,并且试图获取每个任务的分配用户。但是,可以说,由于某种原因,在我的数据库中,任务id从80开始,而不是从1开始,我总共有5个任务。
我编写了以下代码来获取用户和任务之间的关系,因此我希望最后它应该返回一个包含5个键的数组,每个键都包含一个为特定任务分配了用户ID的数组。 / p>
问题是我得到一个总共有85个键的数组,而前80个键是undefined
。
我尝试使用.map()
代替.forEach()
,但得到的结果相同。
let assignedUsers = new Array();
this.taskLists.forEach(taskList => {
taskList.tasks.forEach(task => {
let taskId = task.id;
assignedUsers[taskId] = [];
task.users.forEach(user => {
if(taskId == user.pivot.task_id) {
assignedUsers[taskId].push(user.pivot.user_id);
}
});
});
});
return assignedUsers;
我认为问题出在这一行,但是我不明白为什么...
assignedUsers[taskId] = [];
我设法使用下面的行从数组中过滤并删除了空键:
assignedUsers = assignedUsers.filter(e => e);
还是,我想了解为什么会这样,如果有什么办法可以避免它发生。
期待您的评论!
答案 0 :(得分:4)
如果taskId不是数字或不能自动转换为数字,则必须使用对象。 assignedUsers = {};
答案 1 :(得分:1)
这应该可以按您希望的方式工作。为了便于阅读,它还使用了更多的JS功能。
return this.taskLists.reduce((acc, taskList) => {
taskList.tasks.forEach(task => {
const taskId = task.id;
acc[taskId] = task.users.filter(user => taskId == user.pivot.task_id);
});
return acc;
}, []);
但是您可能要使用一个对象,因为该数组在0和所有未使用的索引之间会有“空洞”。
答案 2 :(得分:0)
您的键是task.id
,因此,如果有未定义的键,它们必须来自未定义的任务ID。如果任务ID为falsey,则只需跳过。如果您希望任务ID可能为0,则可以对typeof taskId === undefined
this.taskLists.forEach(taskList => {
taskList.tasks.forEach(task => {
let taskId = task.id;
// Skip this task if it doesn't have a defined id
if(!taskId) return;
assignedUsers[taskId] = [];
task.users.forEach(user => {
if(taskId == user.pivot.task_id) {
assignedUsers[taskId].push(user.pivot.user_id);
}
});
});
});