Метод Javascript forEach () создает массив с неопределенными ключами - PullRequest
0 голосов
/ 02 мая 2019

Я создаю простое приложение todo и пытаюсь получить назначенных пользователей для каждой задачи.Но допустим, что в моей базе данных по какой-то причине идентификатор задачи начинается с 80, а не с 1, и у меня всего 5 задач.

Я написал следующий код, чтобы получить связь между пользователеми задача, так что я ожидаю, что в конце он должен вернуть массив, содержащий 5 ключей, каждый ключ содержит массив с назначенным идентификатором пользователя для конкретной задачи.

Проблема в том, что я получаю массив с 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;

Iпредположим, что проблема в этой строке, но я не понимаю, почему ...

assignedUsers[taskId] = [];

Мне удалось отфильтровать и удалить пустые ключи из массива, используя следующую строку:

assignedUsers = assignedUsers.filter(e => e);

Тем не менее, я хочу понять, почему это происходит, и если есть какой-то способ, которым я мог бы избежать этого.

Ждем ваших комментариев!

Ответы [ 3 ]

4 голосов
/ 02 мая 2019

Если ваш taskId не является Number или автоконвертируемым в Number, вы должны использовать Object. assignedUsers = {};

1 голос
/ 02 мая 2019

Это должно работать так, как вы хотите. Он также использует больше функций 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 и всеми неиспользуемыми индексами.

0 голосов
/ 02 мая 2019

Ваши ключи task.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);
            }
        });
    });
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...