Javascript的forEach()方法使用未定义的键创建数组

时间:2019-05-01 21:44:26

标签: javascript arrays foreach

我正在构建一个简单的待办事项应用程序,并且试图获取每个任务的分配用户。但是,可以说,由于某种原因,在我的数据库中,任务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);

还是,我想了解为什么会这样,如果有什么办法可以避免它发生。

期待您的评论!

3 个答案:

答案 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);
            }
        });
    });
});