Search code examples
javascriptarraystypescriptlodash

Find Object inside an Array of nested Objects (Lodash / Javascript / Typescript)


Lets say have an Array of Objects that looks like this:

    let example = [
      {
        children: [{
          data: { id: 2, group: 1001, name: "Audi" },
        }],
        data: { id: 1, group: 1000, name: "Cars" }
      },
      {
        children: [{
          data: { id: 4, group: 1003, name: "Airbus A320" },
        }],
        data: { id: 3, group: 1002, name: "Planes" }
      },
      {
        children: [{
          data: { id: 6, group: 1005, name: "Departed" }
        }],
        data: { id: 5, group: 1006, name: "movies" }
      }
    ]

In my application the User selects a Tablerow and i get the selected Row Information aka the 'data' object e.g.

{ id: 2, group: 1001, name: "Audi" }

Now i want to find that selected data object based on the Id in my Array using lodash or javascript/typescript.

How would i achive that? The children Array causes me problems.

EDIT: The Child of a Child should also be found.

{
        children: [{
          children: [{
             data: {id : 7, group 1001, name: "A8"},
             children: [{...}]
          }],
          data: { id: 2, group: 1001, name: "Audi" },
        }],
        data: { id: 1, group: 1000, name: "Cars" }
      }

Solution

  • /** find by id data using recursion */
    function findById(data, id) {
      for (const datum of data) {
        if (datum.data.id == id) return datum
        if (datum.children) {
          let result = findById(datum.children, id)
          if (result) return result
        }
      }
    }
    
    
    let example = [{
        children: [{
          data: {
            id: 2,
            group: 1001,
            name: "Audi"
          },
        }],
        data: {
          id: 1,
          group: 1000,
          name: "Cars"
        }
      },
      {
        children: [{
          data: {
            id: 4,
            group: 1003,
            name: "Airbus A320"
          },
        }],
        data: {
          id: 3,
          group: 1002,
          name: "Planes"
        }
      },
      {
        children: [{
          data: {
            id: 6,
            group: 1005,
            name: "Departed"
          }
        }],
        data: {
          id: 5,
          group: 1006,
          name: "movies"
        }
      }
    ]
    
    
    
    console.log(findById(example, 2))