Я создаю простое приложение 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;

Я предполагаю, что проблема в этой линии, но я не понимаю, почему ...

assignedUsers[taskId] = [];

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

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

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

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

0
Daniel R. 2 Май 2019 в 00:44

3 ответа

Лучший ответ

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

4
Kai Lehmann 1 Май 2019 в 21:49

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

1
Akxe 1 Май 2019 в 22:03

Ваши ключи 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);
            }
        });
    });
});
0
Asthmatic 1 Май 2019 в 21:52