0

I need help to come up with a solution to retrieve all possible paths to an array containing several JSON objects containing the two keys: name[String] and children [Array]. For any given JSON input, I need an array of strings with all routes in the JSON, returning only the name of each item. The input array object can contain any number of nested children.

For example:

Obj = [
 { name: ‘name1’ },
 { name: ‘name2’ },
 { name: ‘name3’, children:[
   { name: name3Child1 },
   { name: name3Child2 },
   { name: name3Child3, children:[{ name: 'name3Child3Child1' }] }
  ]
 },
 { name: ‘name4’ },
]

With the above example, the output I'll need is:

result = [
 'name1',
 'name2',
 'name3',
 'name3.name3Child1',
 'name3.name3Child2',
 'name3.name3Child3.name3Child3Child1',
 'name4',
]

If you can provide ES6+ examples, I'd really appreciate it. I've searched online but many examples relate to standard JSON objects, where as this is in a custom format.

Thanks

Cerbrus
  • 70,800
  • 18
  • 132
  • 147
Chris
  • 392
  • 1
  • 4
  • 16

3 Answers3

2

const obj = [
    { name: 'name1' },
    { name: 'name2' },
    {
        name: 'name3',
        children: [
            { name: 'name3Child1' },
            { name: 'name3Child2' },
            { name: 'name3Child3', children: [{ name: 'name3Child3Child1' }] },
        ],
    },
    { name: 'name4' },
]

const Recursive = (data, prefix = []) =>
    data.reduce((acc, val) => {
        acc.push(
            `${prefix.join('.')}${prefix.length > 0 ? '.' : ''}${val.name}`
        )

        if (val.children?.length > 0)
            acc.push(...Recursive(val.children, [...prefix, val.name]))

        return acc
    }, [])

console.log(Recursive(obj))
kennarddh
  • 2,186
  • 2
  • 6
  • 21
0

Use a recursive function to iterate children:

Obj = [
 { name: 'name1' },
 { name: 'name2' },
 { name: 'name3', children:[
   { name: 'name3Child1' },
   { name: 'name3Child2' },
   { name: 'name3Child3', children:[{ name: 'name3Child3Child1' }] }
  ]
 },
 { name: 'name4' },
]


const result = []

// ITERATE ALL ITEMS IN Obj
for (let row of Obj) {

  // PUSH Name
  result.push(row.name)
  
  // IF THERE ARE CHILDREN, CALL THE RECURSIVE FUNCTION
  if (row.hasOwnProperty('children')) {
    recursiveFunct(row.children, row.name)
  }
}


console.log(result)



function recursiveFunct(item, parentName) {
  // ITERATE ALL CHILDREN
  for (let subItem of item) {
    // PUSH ParentName.ItemName
    result.push(parentName + '.' + subItem.name)
    
    // CALL THIS FUNCTION AGAIN IF THERE ARE FURTHER CHILDREN
    if (subItem.hasOwnProperty('children')) {
      recursiveFunct(subItem.children, parentName + '.' + subItem.name)
    }
  }
}
GrafiCode
  • 3,307
  • 3
  • 26
  • 31
-1
function t(obj) {
  let results = [];
  obj.forEach((item) => {
    results.push(item.name);
    if (item instanceof Object && Object.keys(item).length > 1) {
      t(item.children).forEach((i) => {
        results.push(item.name + '.' + i);
      });
    }
  });
  return results;
}
planB
  • 1
  • 3