Нет необходимости в рекурсии.Просто простой цикл над объектами.Для каждого объекта, если его parent_id равен 0, скопируйте его в массив ответов.В противном случае получите доступ к родительскому объекту по его местоположению в массиве и добавьте текущий объект к его списку дочерних элементов.
Вот как это работает для вашего массива.Обратите внимание на результат того факта, что обновление объекта один раз обновляет все копии этого объекта.
0: Start
answer = []
objects = [
{id : 1, parent_id : 0},
{id : 2, parent_id : 1},
{id : 3, parent_id : 1},
{id : 4, parent_id : 2},
{id : 5, parent_id : 4},
{id : 6, parent_id : 0}
]
1: Append object 1 to answer
answer = [
{id : 1, parent_id : 0}
]
objects = [
{id : 1, parent_id : 0},
{id : 2, parent_id : 1},
{id : 3, parent_id : 1},
{id : 4, parent_id : 2},
{id : 5, parent_id : 4},
{id : 6, parent_id : 0}
]
2: Append object 2 to children of object 1
answer = [
{id : 1, parent_id : 0, children : [
{id : 2, parent_id : 1}
]}
]
objects = [
{id : 1, parent_id : 0, children : [
{id : 2, parent_id : 1}
]},
{id : 2, parent_id : 1},
{id : 3, parent_id : 1},
{id : 4, parent_id : 2},
{id : 5, parent_id : 4},
{id : 6, parent_id : 0}
]
3: Append object 3 to children of object 1
answer = [
{id : 1, parent_id : 0, children : [
{id : 2, parent_id : 1},
{id : 3, parent_id : 1}
]}
]
objects = [
{id : 1, parent_id : 0, children : [
{id : 2, parent_id : 1},
{id : 3, parent_id : 1}
]},
{id : 2, parent_id : 1},
{id : 3, parent_id : 1},
{id : 4, parent_id : 2},
{id : 5, parent_id : 4},
{id : 6, parent_id : 0}
]
4: Append object 4 to children of object 2
answer = [
{id : 1, parent_id : 0, children : [
{id : 2, parent_id : 1},
{id : 3, parent_id : 1, children : [
{id : 4, parent_id : 3}
]}
]}
]
objects = [
{id : 1, parent_id : 0, children : [
{id : 2, parent_id : 1},
{id : 3, parent_id : 1, children : [
{id : 4, parent_id : 3}
]}
]},
{id : 2, parent_id : 1},
{id : 3, parent_id : 1, children : [
{id : 4, parent_id : 3}
]},
{id : 4, parent_id : 2},
{id : 5, parent_id : 4},
{id : 6, parent_id : 0}
]
5: Append object 5 to children of object 4
answer = [
{id : 1, parent_id : 0, children : [
{id : 2, parent_id : 1},
{id : 3, parent_id : 1, children : [
{id : 4, parent_id : 3, children : [
{id : 5, parent_id : 4}
]}
]}
]}
]
objects = [
{id : 1, parent_id : 0, children : [
{id : 2, parent_id : 1},
{id : 3, parent_id : 1, children : [
{id : 4, parent_id : 3, children : [
{id : 5, parent_id : 4}
]}
]}
]},
{id : 2, parent_id : 1},
{id : 3, parent_id : 1, children : [
{id : 4, parent_id : 3, children : [
{id : 5, parent_id : 4}
]}
]},
{id : 4, parent_id : 3, children : [
{id : 5, parent_id : 4}
]}
{id : 5, parent_id : 4},
{id : 6, parent_id : 0}
]
6: Append object 6 to answer
answer = [
{id : 1, parent_id : 0, children : [
{id : 2, parent_id : 1},
{id : 3, parent_id : 1, children : [
{id : 4, parent_id : 3, children : [
{id : 5, parent_id : 4}
]}
]}
]},
{id : 6, parent_id : 0}
]
objects = [
{id : 1, parent_id : 0, children : [
{id : 2, parent_id : 1},
{id : 3, parent_id : 1, children : [
{id : 4, parent_id : 3, children : [
{id : 5, parent_id : 4}
]}
]}
]},
{id : 2, parent_id : 1},
{id : 3, parent_id : 1, children : [
{id : 4, parent_id : 3, children : [
{id : 5, parent_id : 4}
]}
]},
{id : 4, parent_id : 3, children : [
{id : 5, parent_id : 4}
]}
{id : 5, parent_id : 4},
{id : 6, parent_id : 0}
]