Nik_o_lay
@Nik_o_lay
Изучаю фронтенд

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

есть массив:
const items = [
  {id: 1, name: "Foo", parent_id: []}, 
  {id: 2, name: "Bar", parent_id: [1]}, 
  {id: 3, name: "Duc", parent_id: [5]}, 
  {id: 4, name: "Zik", parent_id: []}, 
  {id: 5, name: "Puh", parent_id: [4]}
];

из него нужно получить массив:
const items = [
  {id: 1, name: "Foo", children: [
    {id: 2, name: "Bar", children: []}
  ]}, 
  {id: 2, name: "Bar", children: []}, 
  {id: 3, name: "Duc", children: []}, 
  {id: 4, name: "Zik", children: [
    {id: 5, name: "Puh", children: [
      {id: 3, name: "Duc", children: []}
    ]}
  ]}, 
  {id: 5, name: "Puh", children: [
    {id: 3, name: "Duc", children: []}
  ]}
];

типа структура:
Foo
--Bar
Bar
Duc
Zik
--Puh
----Duc
Puh
--Duc

суть в том, что делаю 3х-уровневое меню, пункты которого хранятся в виде первого массива,
на стороне сервера его нужно привести в вид второго, чтобы на клиенте не делать дополнительную логику
  • Вопрос задан
  • 99 просмотров
Решения вопроса 1
@StockholmSyndrome
items.forEach((item) => {
  item.parent_id.forEach((id) => {
    let elem = items.find((item) => item.id === id);
    (elem.children = elem.children || []).push(item);
  });
  item.children = item.children || [];
});
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
@Magrian
Как вариант
items.forEach(el => {
    if (el.parent_id.length) {
        let parent_elem = items.find(parent_el => parent_el.id === el.parent_id[0])
        if (!parent_elem.children) {
            parent_elem.children = []
        }
        parent_elem.children.push(el)
    }
    delete el.parent_id
})
Ответ написан
Комментировать
На сервере nodejs? Тогда смотрите в сторону https://developer.mozilla.org/uk/docs/Web/JavaScri...
Ответ написан
Ваш ответ на вопрос

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

Похожие вопросы