我需要生成一些代表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
}
答案 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; }