"use strict"; /** * Высчитывает количество задач по каждому статусу для каждого проекта. * * @param projects {Array} * @param statuses {Array} * @param tasks {Array} * * @returns {Array} */ function getReport(projects, statuses, tasks) { function index(array) { return array.reduce(function (acc, item) { acc[item.id] = item.title; return acc; }, {}); } var indexedProjects = index(projects); var indexedStatuses = index(statuses); function createInitialValue(projectId) { return statuses.reduce(function (statusesAcc, status) { statusesAcc[status.title] = 0; return statusesAcc; }, {title: indexedProjects[projectId]}); } var result = tasks.reduce(function (acc, task) { if (acc[task.project_id] === undefined) { acc[task.project_id] = createInitialValue(task.project_id); } var statusTitle = indexedStatuses[task.status_id]; acc[task.project_id][statusTitle] += 1; return acc; }, {}); return Object.values(result); } var validResult = [ { "title": "Canape CRM", "Площадка разворачивается": 0, "Площадка обновляется": 13, "Выполняется резервное копирование": 2, "ОК": 0, "Ошибка": 1 }, { "title": "Мастер", "Площадка разворачивается": 1, "Площадка обновляется": 6, "Выполняется резервное копирование": 2, "ОК": 0, "Ошибка": 0 }, { "title": "Canape CMS", "Площадка разворачивается": 13, "Площадка обновляется": 23, "Выполняется резервное копирование": 12, "ОК": 2, "Ошибка": 5 } ]; var result = getReport( [ {"id": 2, "title": "Canape CRM"}, {"id": 3, "title": "Мастер"}, {"id": 1, "title": "Canape CMS"} ], [ {"id": 7, "title": "Площадка разворачивается"}, {"id": 1, "title": "Площадка обновляется"}, {"id": 2, "title": "Выполняется резервное копирование"}, {"id": 3, "title": "ОК"}, {"id": 6, "title": "Ошибка"} ], [{"project_id": 2, "status_id": 2}, {"project_id": 2, "status_id": 1}, {"project_id": 2, "status_id": 1}, {"project_id": 1, "status_id": 1}, {"project_id": 2, "status_id": 1}, {"project_id": 1, "status_id": 2}, {"project_id": 1, "status_id": 1}, {"project_id": 1, "status_id": 7}, {"project_id": 1, "status_id": 2}, {"project_id": 1, "status_id": 1}, {"project_id": 1, "status_id": 1}, {"project_id": 1, "status_id": 1}, {"project_id": 3, "status_id": 1}, {"project_id": 1, "status_id": 7}, {"project_id": 1, "status_id": 1}, {"project_id": 1, "status_id": 6}, {"project_id": 1, "status_id": 3}, {"project_id": 2, "status_id": 2}, {"project_id": 1, "status_id": 7}, {"project_id": 1, "status_id": 2}, {"project_id": 1, "status_id": 2}, {"project_id": 1, "status_id": 7}, {"project_id": 1, "status_id": 7}, {"project_id": 1, "status_id": 7}, {"project_id": 1, "status_id": 7}, {"project_id": 3, "status_id": 7}, {"project_id": 1, "status_id": 2}, {"project_id": 3, "status_id": 1}, {"project_id": 2, "status_id": 1}, {"project_id": 1, "status_id": 2}, {"project_id": 1, "status_id": 1}, {"project_id": 3, "status_id": 1}, {"project_id": 3, "status_id": 2}, {"project_id": 1, "status_id": 1}, {"project_id": 1, "status_id": 1}, {"project_id": 1, "status_id": 1}, {"project_id": 2, "status_id": 1}, {"project_id": 1, "status_id": 1}, {"project_id": 1, "status_id": 1}, {"project_id": 3, "status_id": 1}, {"project_id": 1, "status_id": 2}, {"project_id": 1, "status_id": 1}, {"project_id": 3, "status_id": 1}, {"project_id": 1, "status_id": 6}, {"project_id": 1, "status_id": 3}, {"project_id": 1, "status_id": 1}, {"project_id": 1, "status_id": 1}, {"project_id": 1, "status_id": 7}, {"project_id": 1, "status_id": 6}, {"project_id": 3, "status_id": 1}, {"project_id": 1, "status_id": 1}, {"project_id": 1, "status_id": 2}, {"project_id": 1, "status_id": 7}, {"project_id": 3, "status_id": 2}, {"project_id": 1, "status_id": 1}, {"project_id": 1, "status_id": 6}, {"project_id": 1, "status_id": 6}, {"project_id": 2, "status_id": 1}, {"project_id": 1, "status_id": 2}, {"project_id": 1, "status_id": 1}, {"project_id": 1, "status_id": 1}, {"project_id": 2, "status_id": 1}, {"project_id": 1, "status_id": 1}, {"project_id": 2, "status_id": 1}, {"project_id": 1, "status_id": 7}, {"project_id": 1, "status_id": 1}, {"project_id": 2, "status_id": 1}, {"project_id": 1, "status_id": 7}, {"project_id": 1, "status_id": 1}, {"project_id": 1, "status_id": 2}, {"project_id": 2, "status_id": 1}, {"project_id": 2, "status_id": 6}, {"project_id": 2, "status_id": 1}, {"project_id": 1, "status_id": 7}, {"project_id": 1, "status_id": 1}, {"project_id": 2, "status_id": 1}, {"project_id": 1, "status_id": 2}, {"project_id": 1, "status_id": 2}, {"project_id": 2, "status_id": 1}, {"project_id": 1, "status_id": 7}] ); console.log(validResult, result);