chans
chans

Reputation: 5260

How to Convert nested json to array of object in Javascript?

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

Answers (1)

Nina Scholz
Nina Scholz

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

Related Questions