Как сгруппированные элементы одного массива добавить элементам другого массива?

Приходит с сервера 2 массива:

let project = [1....100] // проекты
let runs = [1...2000] // задачи.

Массив проектов - это объекты у которых есть название и специальный id. У задач тоже объекты с tilte, description, id, и так же id проекта. У нескольких задач может быть один и тот же id проекта => эти задачи относятся к одному проекту.

Надо как-то сгруппировать эти два массива таким образом:

let data = [
  {
    title:'id project',
    description:[]// все задачи которые относятся к этому проекту (у них будет такой же project_id как и у проекта)
  },
  {
    title:'id project',
    description:[]// все задачи которые относятся к этому проекту (у них будет такой же project_id как и у проекта)
  },
  {
    title:'id project',
    description:[]// все задачи которые относятся к этому проекту (у них будет такой же project_id как и у проекта)
  },
]

Как такое можно сделать?
  • Вопрос задан
  • 141 просмотр
Решения вопроса 3
0xD34F
@0xD34F Куратор тега JavaScript
const result = Object.values(runs.reduce(
  (acc, n) => (acc[n.projectId]?.description.push(n), acc),
  Object.fromEntries(projects.map(n => [ n.id, { ...n, description: [] } ]))
));

или

const result = projects.map(function(n) {
  return {
    ...n,
    description: this[n.id] ?? [],
  };
}, runs.reduce((acc, n) => ((acc[n.projectId] = acc[n.projectId] ?? []).push(n), acc), {}));

или

const result = projects.map(n => ({
  ...n,
  description: runs.filter(m => m.projectId === n.id),
}));
Ответ написан
Комментировать
RAX7
@RAX7
const projects = Array.from(
  { length: 10 },
  (_, i) => ({title: `proj_${i}`, id: i})
);

const runs = Array.from(
  { length: 100 },
  (_, i) => ({title: `task_${i}`, id: i, pid: randomInteger(0, 10)})
);

const data = projects.map(proj => ({
  title: proj.title,
  tasks: runs.filter(t => t.pid === proj.id)
}));

console.log(data);


// utils
function randomInteger(min, max) {
  let rand = min + Math.random() * (max + 1 - min);
  return Math.floor(rand);
}
Ответ написан
Надо как то отсортировать эти 2 массива

Тут не сортировка нужна, а преобразование данных в новый массив.
const data = projects.reduce((acc, curr) => {
  const copy = {...curr}
  copy.description = runs.filter(r => r.projectId === curr.id)
  acc.push(copy)
  return acc
}, [])
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы