Reputation: 5260
I've a deep nested object like this:
{
'name_1': 'val',
'name_2': 'val',
'name_3': {
'name_4': {
'name_5': {
'name_6': 'val',
'name_7': 'val',
'name_8': {
'name_9': 'val'
}
}
}
}
}
Here key can be anything instead of name_1, name_2, name_3...etc(names key as name_1, name_2.. just for quick understanding)
I wanted to convert the above json to array of objects in the below mentioned format
[
{ "id": "1", "name": 'name_1: val', "parent_id": "0"},
{ "id": "2", "name": 'name_2: val', "parent_id": "0"},
{ "id": "3", "name": 'name_3', "parent_id": "0"},
{ "id": "4", "name": 'name_4', "parent_id": "3"},
{ "id": "5", "name": 'name_5', "parent_id": "4"},
{ "id": "6", "name": 'name_6: val', "parent_id": "5"},
{ "id": "7", "name": 'name_7: val', "parent_id": "5"},
{ "id": "8", "name": 'name_8', "parent_id": "5"},
{ "id": "9", "name": 'name_9: val', "parent_id": "8"},
]
Any help would be really apprectiated!!
Upvotes: 0
Views: 1791
Reputation: 386550
You could take an iterative and recursive approach. (The id
is stored in an object to keep the same object reference for it and this allows to use it in all nested recursive calls.)
function flat(object, id = { id: 0 }, parent_id = 0) {
return Object.entries(object).reduce((r, [k, v]) => {
var name = k + (typeof v === 'string' ? ': ' + v : '');
r.push({ id: id.id++, name, parent_id });
if (v && typeof v === 'object') r.push(...flat(v, id, id.id));
return r;
}, []);
}
var data = { name_1: 'val', name_2: 'val', name_3: { name_4: { name_5: { name_6: 'val', name_7: 'val', name_8: { name_9: 'val' } } } } },
result = flat(data);
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
Upvotes: 2