You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:48:40