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.
