Home > Net >  How can I get keys from nested object?
How can I get keys from nested object?

Time:01-13

I have a javascript object with nested objects inside:

{
    "common": {
      "setting1": "Value 1",
      "setting2": 200,
      "setting3": true,
      "setting6": {
        "key": "value",
        "doge": {
          "wow": ""
        }
      }
    },
    "group1": {
      "baz": "bas",
      "foo": "bar",
      "nest": {
        "key": "value"
      }
    },
    "group2": {
      "abc": 12345,
      "deep": {
        "id": 45
      }
    }
  }

and I have to get all keys as nested array.

I've tried this function :

function getKeys(obj) {                                                                                                                                
  return Object.keys(obj).map((key, keys) => {                                                                                                      
    if (typeof obj[key] !== 'object') return key;                                                                                                    
    return [key, getKeys(obj[key])];                                                                                               
  });                                                                                                                                                  
}    

 

And got this: //

[
  [ 'common', [ 'setting1', 'setting2', 'setting3', [Array] ] ],
  [ 'group1', [ 'baz', 'foo', [Array] ] ],
  [ 'group2', [ 'abc', [Array] ] ]
]

Instead of expected result like this:

    [
  [ 'common', [ 'setting1', 'setting2', 'setting3','setting6', ['key','doge', ['wow']],
  [ 'group1', [ 'baz', 'foo', ['nest', ['key'] ],
  [ 'group2', [ 'abc', 'deep', ['id'] ] ]
    ]

etc.

Help me please

CodePudding user response:

You can use reduce on Object.entries and create a recursive function.

const data = {"common":{"setting1":"Value 1","setting2":200,"setting3":true,"setting6":{"key":"value","doge":{"wow":""}}},"group1":{"baz":"bas","foo":"bar","nest":{"key":"value"}},"group2":{"abc":12345,"deep":{"id":45}}}

function getKeys(data) {
  return Object.entries(data).reduce((r, [key, value]) => {
    r.push(key)
    if (typeof value === 'object') r.push(getKeys(value))
    return r
  }, [])
}

console.log(getKeys(data))

CodePudding user response:

Try this

function getKeys (obj) {
    const keys = Object.keys(obj);
    for (let i = 0; i < keys.length; i  ){
        const key = keys[i];
        if (typeof obj[key] === 'object') {
            keys.splice(i 1, 0, getKeys(obj[key]));
            i  ;
        }
    }
    return keys
}

result:

'["common",["setting1","setting2","setting3","setting6",["key","doge",["wow"]]],"group1",["baz","foo","nest",["key"]],"group2",["abc","deep",["id"]]]'

Not the most optimised solution probably but should work.

  •  Tags:  
  • Related