JS动态生成带父引用的数据库文档对象:参数定义难题
解决带父引用的数据库文档生成问题
我明白你的痛点了——原来的函数只能生硬地生成固定数量的节点,完全没法控制它们之间的层级关联对吧?咱们来重构一下,让这个生成函数能精准按照你要的层级结构输出带父引用的文档。
核心思路:用配置对象替代单一数字参数
原来的generateContent(2,2,3)这种参数方式,只能定义总数量,没法体现层级关系。我们换成结构化配置参数,让你能控制每个父节点下的子节点数量:
- 指定main节点的总数
- 指定每个main节点下可以带多少个group、多少个直接item
- 指定每个group节点下可以带多少个item
这样就能灵活生成main→group→item、main→item等任意组合的关联结构了。
完整实现代码
// 假设你有现成的Random.id()生成唯一ID,如果没有可以用下面的简易版 // const generateId = () => Math.random().toString(36).substring(2, 10); function generateContent(config) { const { mainCount = 0, mainConfig = { groupsPerMain: 0, itemsPerMain: 0 }, groupConfig = { itemsPerGroup: 0 } } = config; const allDocs = []; const mainIds = []; // 1. 生成所有main节点 for (let i = 0; i < mainCount; i++) { const mainId = Random.id(); // 或者用generateId() const mainDoc = { _id: mainId }; allDocs.push(mainDoc); mainIds.push(mainId); } // 2. 为每个main生成对应的group节点 mainIds.forEach(mainId => { for (let i = 0; i < mainConfig.groupsPerMain; i++) { const groupId = Random.id(); const groupDoc = { _id: groupId, parent: mainId, type: 'group' }; allDocs.push(groupDoc); // 3. 为当前group生成对应的item节点 for (let j = 0; j < groupConfig.itemsPerGroup; j++) { const itemId = Random.id(); const itemDoc = { _id: itemId, parent: groupId, type: 'item' }; allDocs.push(itemDoc); } } // 4. 为当前main生成直接关联的item节点 for (let i = 0; i < mainConfig.itemsPerMain; i++) { const itemId = Random.id(); const itemDoc = { _id: itemId, parent: mainId, type: 'item' }; allDocs.push(itemDoc); } }); return allDocs; }
调用示例(生成你给出的示例结构)
你要的[main1→group1, group2; group1→item1, item2; main1→item3; main2]结构,可以这样调用:
const result = generateContent({ mainCount: 2, mainConfig: { groupsPerMain: 2, // 每个main带2个group itemsPerMain: 1 // 每个main带1个直接item }, groupConfig: { itemsPerGroup: 2 // 每个group带2个item } }); console.log(result);
这个调用会生成:
- 2个main节点
- 第一个main下有2个group,每个group下有2个item,同时还有1个直接关联的item
- 第二个main无任何子节点
完全符合你给出的示例结构。
扩展灵活性
如果需要更灵活的配置(比如不同main节点带不同数量的group),可以把mainConfig改成数组,每个元素对应一个main的配置。比如:
const result = generateContent({ mainConfig: [ { groupsPerMain: 2, itemsPerMain: 1 }, // 第一个main的配置 { groupsPerMain: 0, itemsPerMain: 0 } // 第二个main无任何子节点 ] });
只需要稍微修改函数里的遍历逻辑就能支持这种场景,非常方便。
内容的提问来源于stack exchange,提问作者user3142695
相关产品推荐
相关产品推荐

