Как конвертировать вложенный JSON в массив объектов в Javascript? - PullRequest
0 голосов
/ 06 ноября 2019

У меня есть глубоко вложенный объект, подобный этому:

{
  'name_1': 'val',
  'name_2': 'val',
  'name_3': {
    'name_4': {
      'name_5': {
        'name_6': 'val',
        'name_7': 'val',
        'name_8': {
          'name_9': 'val'
        }
      }
    }
  }
}

Здесь ключом может быть что угодно вместо name_1, name_2, name_3 ... и т. Д. (Называет ключ как name_1, name_2 .. просто для быстрого понимания)

Я хотел преобразовать вышеупомянутый json в массив объектов в указанном ниже формате

[
  { "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"},
]

Любая помощьбыл бы очень признателен !!

1 Ответ

2 голосов
/ 06 ноября 2019

Вы можете использовать итеративный и рекурсивный подход. (id хранится в объекте, чтобы сохранить для него ту же ссылку на объект, и это позволяет использовать его во всех вложенных рекурсивных вызовах.)

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; }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...