Search code examples
arraysjsonloopsfamily-tree

How to access or loop through the nested array of objects which can be infinite sometimes or keep adding by the user in jSON array objects in nodejs?


I have a JSON object which has a nested array as children. So basically I have a family tree that can gets keep expanding means the addition of children can happen. And I want to access every object inside this family tree via a loop. How can I do that? I am unable to think away. Or maybe any other way to achieve this?

exports familyHead = {
      name: 'Shan',
      type:String,
      generation:101,
      children : [
        {
          name: 'Chit',
          type:String,
          gender:'Male',
          generation:102,
          children :[
            {
              name: 'Dritha',
              type:String,
              gender:'Female',
              generation:103,
              children:[
                {
                  name: 'Yodhan',
                  type:String,
                  gender:'Male',
                  generation:104
                }
              ]
            },
            {
              name: 'Tritha',
              type:String,
              gender:'Female',
              generation:103
            },
            {
              name: 'Vritha',
              type:String,
              gender:'Male',
              generation:103
            }
          ]
        },
        {
          name: 'Ish',
          type:String,
          gender:'Male',
          generation:102
        },
        {
          name: 'Vich',
          type:String,
          gender:'Male',
          generation:102,
          children:[
            {
              name: 'Vila',
              type:String,
              gender:'Female',
              generation:103
          },
          {
            name: 'Chika',
            type:String,
            gender:'Female',
            generation:103
        }
        ]
        },
        {
          name: 'Aras',
          type:String,
          gender:'Male',
          generation:102,
          children:[
            {
              name: 'Jinki',
              type:String,
              gender:'Female',
              generation:103,
              children:[
                {
                  name: 'Laki',
                  type:String,
                  gender:'Male',
                  generation:104
                },
                {
                  name: 'Lavanya',
                  type:String,
                  gender:'Female',
                  generation:104
                }
              ]
          },
          {
            name: 'Ahit',
            type:String,
            gender:'Male',
            generation:103
        }
          ]
        },
        {
          name: 'Satya',
          type:String,
          gender:'Female',
          generation:102,
          children:[
            {
              name: 'Asva',
              type:String,
              gender:'Male',
              generation:103,
              children:[
                {
                  name: 'Vasa',
                  type:String,
                  gender:'Male',
                  generation:104
                }
              ]
            },
            {
              name: 'Vyas',
              type:String,
              gender:'Male',
              generation:103,
              children:[
                {
                  name: 'Kriya',
                  type:String,
                  gender:'Male',
                  generation:104
                },
                {
                  name: 'Krithi',
                  type:String,
                  gender:'Male',
                  generation:104
                }
              ]
            },
            {
              name: 'Atya',
              type:String,
              gender:'Female',
              generation:103
            }
          ]
        }
      ]
    }

Solution

  • You can use recursion to access every person in the family. If you want to display every family member's name, for example, you can display the person's name and then recursively call the function for each child.

    const familyHead = { name: 'Shan', generation: 101, children: [{ name: 'Chit', gender: 'Male', generation: 102, children: [{ name: 'Dritha', gender: 'Female', generation: 103, children: [{ name: 'Yodhan', gender: 'Male', generation: 104 } ]}, { name: 'Tritha', gender: 'Female', generation: 103}, { name: 'Vritha', gender: 'Male', generation: 103 } ]}, { name: 'Ish', gender: 'Male', generation: 102}, { name: 'Vich', gender: 'Male', generation: 102, children: [{ name: 'Vila', gender: 'Female', generation: 103}, { name: 'Chika', gender: 'Female', generation: 103 } ]}, { name: 'Aras', gender: 'Male', generation: 102, children: [{ name: 'Jinki', gender: 'Female', generation: 103, children: [{ name: 'Laki', gender: 'Male', generation: 104}, { name: 'Lavanya', gender: 'Female', generation: 104 } ]}, { name: 'Ahit', gender: 'Male', generation: 103 } ]}, { name: 'Satya', type: String, gender: 'Female', generation: 102, children: [{ name: 'Asva', gender: 'Male', generation: 103, children: [{ name: 'Vasa', gender: 'Male', generation: 104 } ]}, { name: 'Vyas', gender: 'Male', generation: 103, children: [{ name: 'Kriya', gender: 'Male', generation: 104}, { name: 'Krithi', gender: 'Male', generation: 104 } ]}, { name: 'Atya', gender: 'Female', generation: 103 } ]} ]};
    
    const display = (person) => {
      console.log(person.name)
    
      if (person.children) {
        person.children.forEach(display)
      }
    }
    
    display(familyHead)

    If you want to return an array of all the names, add the person's name to a list and recursively call the function for each child.

    const familyHead = { name: 'Shan', generation: 101, children: [{ name: 'Chit', gender: 'Male', generation: 102, children: [{ name: 'Dritha', gender: 'Female', generation: 103, children: [{ name: 'Yodhan', gender: 'Male', generation: 104 } ]}, { name: 'Tritha', gender: 'Female', generation: 103}, { name: 'Vritha', gender: 'Male', generation: 103 } ]}, { name: 'Ish', gender: 'Male', generation: 102}, { name: 'Vich', gender: 'Male', generation: 102, children: [{ name: 'Vila', gender: 'Female', generation: 103}, { name: 'Chika', gender: 'Female', generation: 103 } ]}, { name: 'Aras', gender: 'Male', generation: 102, children: [{ name: 'Jinki', gender: 'Female', generation: 103, children: [{ name: 'Laki', gender: 'Male', generation: 104}, { name: 'Lavanya', gender: 'Female', generation: 104 } ]}, { name: 'Ahit', gender: 'Male', generation: 103 } ]}, { name: 'Satya', type: String, gender: 'Female', generation: 102, children: [{ name: 'Asva', gender: 'Male', generation: 103, children: [{ name: 'Vasa', gender: 'Male', generation: 104 } ]}, { name: 'Vyas', gender: 'Male', generation: 103, children: [{ name: 'Kriya', gender: 'Male', generation: 104}, { name: 'Krithi', gender: 'Male', generation: 104 } ]}, { name: 'Atya', gender: 'Female', generation: 103 } ]} ]}
    
    const getNames = (person) => {
      if (!person.children) {
        return [person.name]
      }
    
      return [person.name, ...person.children.flatMap(getNames)]
    }
    
    console.log(getNames(familyHead))