Stevetro
Stevetro

Reputation: 1963

React iterate recursively through nested objects

i'm trying to iterate recursively over nested objects to get the key and the value.

My data structure is:

  {         
    "id": 8743077530231325861,
    "name": "Name of XYZ",
    "key X": 0,
    "key Y": {
      "details": {
        "value": {
          "up": 5,
          "down": 3
        },
        "path": "xyz"
      },
      "key Z": {
        "value": 1,
        "path": "abc"
      }
    },
    "createdTimestamp": 1554446703000
  }

and my function is:

  recursion = (item, keyString) => {
    if(isObject(item)){
      Object.keys(item).map((key) => {
        return this.recursion(item[key], keyString+`.${key}`)
      })
    }else{
      return {item, keyString}
    }
  }

and i call it by:

Object.keys(data).map(key =>{
   console.log(this.recursion(data[key], key))
})

My problem is that keys which are objects are always undefined. I know thats because they need to iterate an other time and the output is faster then the function. When i print out the values at the end of the recursion function instead of returning them, they are not undefined.

At the end i want for every key all the deepest values and "paths". For Example

8743077530231325861,"id"
Name of XYZ,"name"
0, "keyX"
5, "keyY.details.value.up"
...

I already tried to use await / async but i cant manage to get all values

would be nice if someone have a hint for me

Upvotes: 2

Views: 1434

Answers (1)

Nina Scholz
Nina Scholz

Reputation: 386600

You need to return the result of mapping.

const
    isObject = v => v && typeof v === 'object',
    recursion = (item, path = '') => isObject(item)
        ? Object
            .keys(item)
            .flatMap(k => recursion(item[k], path + (path && '.') + k))
        : { item, path };

var data = { id: 8743077530231326000, name: "Name of XYZ", "key X": 0, "key Y": { details: { value: { up: 5, down: 3 }, path: "xyz" }, "key Z": { value: 1, path: "abc" } }, createdTimestamp: 1554446703000 },
    result = recursion(data);

console.log(result);

Upvotes: 1

Related Questions