Задать вопрос
@dake1231

Как правильно собрать вложенный объект без указания родителя?

Здравствуйте! Есть дерево в виде массива с указанием уровня вложенности, нужно из него сделать массив с вложенными объектами.
На вход имеется вот такой массив:
[
{id:1, title: 'test1', level:0},
{id:2, title: 'test2', level:1},
{id:3, title: 'test3', level:2},
{id:4, title: 'test4', level:1},
{id:5, title: 'test5', level:0},
]


на выходе должны получить вот такой:
[
{
   id:1,
   title: 'test1',
   nodes: [
      {
          id:2,
          title: 'test2',
         nodes: [
             id: 3,
             title: 'test3'
             nodes: []
        ]
      },
      {
          id:4,
          title: 'test4',
          nodes: []
      }
   ],
   {
       id:5,
       title: 'test5',
       nodes: []
   }
}
]
  • Вопрос задан
  • 303 просмотра
Подписаться 1 Простой 1 комментарий
Помогут разобраться в теме Все курсы
  • Нетология
    Fullstack-разработчик на Python + нейросети
    20 месяцев
    Далее
  • Skillfactory
    Профессия Веб-разработчик
    12 месяцев
    Далее
  • Яндекс Практикум
    Фронтенд-разработчик
    10 месяцев
    Далее
Решения вопроса 1
0xD34F
@0xD34F Куратор тега JavaScript
function createTree(data, levelKey, childrenKey) {
  const tree = [];
  const rootLevel = data.length && data[0][levelKey];

  for (const n of data) {
    let arr = tree;

    for (let level = rootLevel; n[levelKey] > level++;) {
      arr = arr[arr.length - 1][childrenKey];
    }

    arr.push(Object.assign({ [childrenKey]: [] }, n));
  }

  return tree;
}

const tree = createTree(arr, 'level', 'nodes');

или

function createTree(
  data,
  {
    levelKey = 'level',
    childrenKey = 'children',
  } = {}
) {
  const rootLevel = data.length && data[0][levelKey];

  return data.reduce((acc, {...n}) => (
    acc[n[levelKey] + 1] = n[childrenKey] = [],
    acc[n[levelKey]].push(n),
    acc
  ), { [rootLevel]: [] })[rootLevel];
}

const tree = createTree(arr, { childrenKey: 'nodes' });
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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