DEV Community

Daniel Bellmas
Daniel Bellmas

Posted on

Build A Tree Array From A Flat Array - Recursion

I got an assignment to display comments in a recursive way, something like so:

Recursive comments

The data I got from the server was flat, meaning:
every item in the array holds a reference to its parent, like so:

 const entries = [ { index: 1, parent: 0 }, { index: 2, parent: 1 }, { index: 3, parent: 2 }, ... ... ]; 
Enter fullscreen mode Exit fullscreen mode

After thinking how to "attack" this problem, I realized
If I want a recursive object, then the easiest solution is a recursive one

Here is the function that converts a flat array to a tree array:

 const arrayToTree = (arr, parent = 0) => arr.filter(item => item.parent === parent) .map(child => ({ ...child, children: arrayToTree(arr, child.index) })); 
Enter fullscreen mode Exit fullscreen mode

A quick rundown:

  • We first filter the root parent's children.
  • Then we do the same to each of the children we just grabbed

My answer to the question on Stack overflow

Here is a codepen if you want to play more with the data ot the solution:


Sources that helped me:

Top comments (4)

Collapse
 
rxliuli profile image
rxliuli • Edited

I have written something like this and published it as an npm package

github.com/rxliuli/liuli-tools/blo...

 const [res] = listToTree( [ { id: 3, parent: 1 }, { id: 4, parent: 1 }, { id: 1, parent: 0 }, { id: 2, parent: 0 }, { id: 5, parent: 2 }, { id: 6, parent: 2 }, { id: 0 }, ], { id: 'id', parentId: 'parent', children: 'children', }, ) 
Enter fullscreen mode Exit fullscreen mode
Collapse
 
danielbellmas profile image
Daniel Bellmas

Cool 😎

Collapse
 
olaf_ranai profile image
Olaf Ranai { dev-it-out }

Nice 👌🏽

Collapse
 
salivity profile image
David Clews

If you are using directories for your structure you could use my solution. It creates a structured object from an array using path and file keys. davidclews.com/article/13.html