Vishnu Shenoy
Vishnu Shenoy

Reputation: 872

how to search a value from a array of objects inside array of objects?

I have an array of object, in which each object has an inner array of the object which in turn has again an inner array of objects, it can go to any level of the inner object which I want to filter and display.

obj = [{ name: "apple", subGroups:  [{ name: "apple-a", subGroups: { name: "apple-b", subGroups:  [{ name: "apple-c", subGroups: { name: "apple-d", subGroups:[]}}]}}]}
{ name: "orange", subGroups: [{ name: "orange-a", subGroups: { name: "orange-b", subGroups:  [{ name: "orange-c", subGroups: { name: "orange-d", subGroups:[]}}]}}]}
{ name: "mango", subGroups:  [{ name: "123", subGroups: []}]}
{ name: "grapes", subGroups:  [{ name: "123", subGroups: []}]}
{ name: "pear", subGroups:  [{ name: "123", subGroups: []}]}]

searchvalue is dynamic 'orange-d' ,

searchvalue = 'orange-d';
result = { name: "orange-d", subGroups:[]}

 const newArr = obj.map(obj => {
      return obj.name === searchvalue;
    }).flat();

I have tried with filter, map, flat but I was not able to find the output, pls help

Upvotes: 3

Views: 76

Answers (2)

Saar Davidson
Saar Davidson

Reputation: 1382

side note: it would probably be better if you will reconsider that recursive structure. for the solution you should use some kind of recursion like so:

var obj = [
  { name: "apple", subGroups:  [
    { name: "apple-a", subGroups: [
      { name: "apple-b", subGroups:  [
        { name: "apple-c", subGroups: [
          { name: "apple-d", subGroups:[]}
        ]}
      ]}
    ]}
  ]},
  { name: "orange", subGroups: [
    { name: "orange-a", subGroups: [
      { name: "orange-b", subGroups:  [
        { name: "orange-c", subGroups: [
          { name: "orange-d", subGroups:[]}
        ]}
      ]}
    ]}
  ]},
  { name: "mango", subGroups:  [
    { name: "123", subGroups: []}
  ]},
  { name: "grapes", subGroups:  [
    { name: "123", subGroups: []}
  ]},
  { name: "pear", subGroups:  [
    { name: "123", subGroups: []}
  ]}
];

var searchvalue = 'orange-d';

function findName(array, name) {
  let result = {};
  
  if(!(Array.isArray(array) && array.length))
    return result;
  
  for(let item of array) {
    if(item.name === name) return item;
    
    result = findName(item.subGroups, name);
    
    if (result && result.name === name) return result;
  }
  
  return result;
}

console.log(findName(obj, searchvalue));

Upvotes: 3

Nina Scholz
Nina Scholz

Reputation: 386836

You could take Array#flatMap with a previous check for the handed over array or object, as if follows later as subGroups.

const
    find = (array, name) => (Array.isArray(array) ? array : [array])
        .flatMap(o => o.name === name ? o : find(o.subGroups, name)),
    data = [{ name: "apple", subGroups: [{ name: "apple-a", subGroups: { name: "apple-b", subGroups: [{ name: "apple-c", subGroups: { name: "apple-d", subGroups: [] } }] } }] }, { name: "orange", subGroups: [{ name: "orange-a", subGroups: { name: "orange-b", subGroups: [{ name: "orange-c", subGroups: { name: "orange-d", subGroups: [] } }] } }] }, { name: "mango", subGroups: [{ name: "123", subGroups: [] }] }, { name: "grapes", subGroups: [{ name: "123", subGroups: [] }] }, { name: "pear", subGroups: [{ name: "123", subGroups: [] }] }],
    result = find(data, 'orange-d');

console.log(result);

Upvotes: 4

Related Questions