Как создать структуру из многомерного обьекта?

Столкнулся с проблемой. У меня есть вот такой массив компонентов

let components = [
  {
    component: "input",
    id: 1,
    parentId: 0,
  },
  {
    component: "select",
    id: 2,
    parentId: 1,
  },
  {
    component: "date",
    id: 3,
    parentId: 2,
  },
  {
    component: "input",
    id: 4,
    parentId: 0,
  },
];

Как сделать так, чтобы на выходе получить вложеные обьекты по логике, что если есть parentId и он совпадает с элементом у которого такой id,то он становится вложенным в него. То есть в данном примере это выглядеть должно так:

{
    component: input,
    id: 1,
    parentId: 0,
    components: {
      component: "Select",
      id: 2,
      parentId: 1,
      components: {
        component: "Date",
        id: 3,
        parentId: 2,
      },
    },
  },
  {
    component: "Input",
    id: 4,
    parentId: 0,
  }
];

Ответы (1 шт):

Автор решения: UserTest013

let o = [{
  component: "input",
  id: 1,
  parentId: 0,
}, {
  component: "select",
  id: 2,
  parentId: 1,
}, {
  component: "date",
  id: 3,
  parentId: 2,
}, {
  component: "input",
  id: 4,
  parentId: 0,
}];

const result = o.reduce((r, _) => (_.parentId === 0 ? r.push(_) : o.some((x) => (x.id === _.parentId ? (x.components = _, true) : false)), r), []);

console.log(result);

→ Ссылка