无法在Javascript中从非关系型数据库构建JSON树

时间:2019-06-18 20:44:14

标签: javascript node.js json recursion tree-traversal

我正在尝试构建一个脚本,该脚本将周期性地递归迭代我的非关系数据库(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对象相同的结构,但仅接收前两层。

0 个答案:

没有答案