Проблемы с построением дерева JSON из нереляционной базы данных в Javascript - PullRequest
1 голос
/ 18 июня 2019

Я пытаюсь создать сценарий, который будет периодически рекурсивно повторять мою нереляционную базу данных (firestore) и генерировать из нее объект JSON.

Я могу перебирать все коллекции, документыи суб-сборка до самого последнего уровня, однако у меня возникают трудности при генерации объекта JSON в правильном формате: либо я получаю два нижних уровня, либо только два верхних.Я также попытался сгенерировать новый объект JSON с каждой рекурсией и добавить его к глобальному объекту JSON, но он также был плохо отформатирован.

После попытки добавления глобального объекта JSON безуспешно я решил проверить свою рекурсию с помощьюсоздание системы папок из нереляционной базы данных, которая была успешной.Тем не менее, я хотел бы автоматизировать процесс, и создание системы папок является довольно дорогостоящим и неэффективным.

Для целей тестирования и устранения возможных ошибок в основном сценарии я создал небольшую программу с заданным JSONмодель данных:

const data = {
  'root': {
    'doc1': {'id':1, 'value' : 545},
    'doc2': {'id':2, 'value' : 645},
    'doc3': {
      'id': 3,
      'subCol31': {'id':31, 'data' : {'value1': {'da' : 2, 'la': 3}, 'value2' : 545}},
      'subCol32': {'id':32, 'data' :  {'value1':31, 'data' :  {'data':{'data':{'id':321, 'data' : {'id':311, 'value' : 5435}}, 'value' : 1545}, 'value' : 45}}}
    },
    'doc4': {'id':4, 'age' : 125}
  }
}
var processed = {};

function isEmpty(obj) {
  let numProperties = 0;
  for (let property in obj) {
    if (obj.hasOwnProperty(property)) {
      ++numProperties;
    }
  }
  return numProperties === 0;
}

function mapParentChildPairs(f, obj) {
  if (isEmpty(obj)) {
    return;
  } else {
    for (let item in obj) {
      if (obj.hasOwnProperty(item)) {
        f(item, obj[item]);
        processed[item] = obj[item];
        mapParentChildPairs(f, obj[item]);
      }
    }
  }
}

mapParentChildPairs(console.log, data);
console.log('processed', processed);

Результат, который я получаю:

{ root:
{ doc1: { id: 1, value: 545 },
doc2: { id: 2, value: 645 },
doc3: { id: 3, subCol31: [Object], subCol32: [Object] },
doc4: { id: 4, age: 125 } },
doc1: { id: 1, value: 545 },
id: 4,
value: 45,
doc2: { id: 2, value: 645 },
doc3:
{ id: 3,
subCol31: { id: 31, data: [Object] },
subCol32: { id: 32, data: [Object] } },
subCol31: { id: 31, data: { value1: [Object], value2: 545 } },
data: { id: 311, value: 5435 },
value1: 31,
da: 2,
la: 3,
value2: 545,
subCol32: { id: 32, data: { value1: 31, data: [Object] } },
doc4: { id: 4, age: 125 },
age: 125 }

Результат, которого я хочу достичь:

{'root': {
'doc1': {'id':1, 'value' : 545},
'doc2': {'id':2, 'value' : 645},
'doc3': {'id': 3,
'subCol31': {'id':31, 'data' : {'value1': {'da' : 2, 'la': 3}, 'value2' : 545}}, 'subCol32': {'id':32, 'data' :  {'value1':31, 'data' :  {'data':{'data':{'id':321, 'data' : {'id':311, 'value' : 5435}}, 'value' : 1545}, 'value' : 45}}}},
'doc4': {'id':4, 'age' : 125}}}

Ожидается получить ту же структуру, что иданный объект json, но получил только первые два уровня.

...