JS:生成通过父字段动态连接的对象

时间:2018-01-19 12:15:44

标签: javascript

我需要生成一些代表DB文档的对象,我需要连接'他们通过父参考。对象非常简单。

我的主要问题是定义输入

对象应该以可变的方式连接:我想调用带有一些参数的函数来获取结果数据。为了让它更容易理解这里的一个例子。

所需结果数据的结构可能如下所示:

- main
  - group
  - group
    - item
    - item
  - item
- main

因此,结果输出应为:

[
  { _id: 'main1ID' },
  { _id: 'group1ID', parent: 'main1ID', type: 'group' },
  { _id: 'group2ID', parent: 'main1ID', type: 'group' },
  { _id: 'item1ID', parent: 'group1ID', type: 'item' },
  { _id: 'item2ID', parent: 'group1ID', type: 'item' },
  { _id: 'item3ID', parent: 'main1ID', type: 'item' },
  { _id: 'main2ID' },
]

正如您所看到的,主要元素可以将组或项目作为子项,甚至没有子项。 团体也可以没有孩子,也可以作为孩子。

所以我尝试从基本功能开始,但我甚至不知道如何定义参数以使该功能动态运行: - (

generateContent(2, 2, 3)可以创建两个主要对象,两个组和三个项目,但没有信息,它们应该如何相互连接。这是我的主要问题......

function generateContent (main = 0, group = 0, item = 0) {
  const mainDocs = []
  for (var i = 0; i <= main; i++) {
    mainDocs.push({
      _id: Random.id()
    })
  }
  // do similiar thing for group and item
  // return everything
}

1 个答案:

答案 0 :(得分:0)

您需要在输入中编码关系。仅指示每种类型节点的数量是不够的。您可以想到几种编码。一个非常简洁的字符串模式如下:

m(gg(ii)i)m

这里每个字母代表要生成的节点类型,圆括号表明它们应该如何相互关联。

这是一个将这样的字符串解析为最终数组的函数:

function generateContent (pattern) {
    const mainDocs = [],
        parents = [],
        count = { m:0, g:0, i:0 };
    let obj, parent;
    for (let ch of pattern) {
        if (ch === '(') {
            parents.push(parent);
            parent = obj._id;
        } else if (ch === ')') {
            parent = parents.pop();
        } else {
            let type = { m: 'main', g: 'group', i: 'item' }[ch];
            obj = {
                _id: type + (++count[ch]) + 'ID'
            };
            if (parent) obj.parent = parent;
            if (ch !== 'm') obj.type = type;
            mainDocs.push(obj);
        }
    }
    return mainDocs;
}

// Example:
const result = generateContent('m(gg(ii)i)m');
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }