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

按嵌套数组键分组时避免文档重复的JavaScript问题

按文档分组整合关联人员信息

现有一段按人员ID分组文档的代码,运行正常,但存在问题:当一个文档关联多名人员时,该文档会在每个关联人员的分组中重复出现。需要调整逻辑,改为按文档分组,将同一文档关联的所有人员信息整合到一起,文档仅保留一份。

原代码

const data = [
    {
      id: 222222,
      document_file_name: "4020653_FileName.pdf",
      document_updated_at: "2020-07-08T19:41:28.385Z",
      document_type_label: "doc label",
      state: "accepted",
      details: [
        {
          id: 20656,
          type: "Claimant",
          name: "First Name Last Name",
          first_name: "First Name",
          last_name: "Last Name",
          type_label: "claimant"
        },
        {
          id: 20657,
          type: "Fellow",
          name: "Fellow First Name Fellow Last Name",
          first_name: "Fellow First Name",
          last_name: "Fellow Last Name",
          type_label: "fellow"
        }
      ]
    },
    {
      id: 1111111,
      document_file_name: "4020600_FileName.pdf",
      document_updated_at: "2020-07-08T19:41:28.385Z",
      document_type_label: "doc label",
      state: "rejected",
      details: [
        {
          id: 20656,
          type: "Claimant",
          name: "First Name Last Name",
          first_name: "First Name",
          last_name: "Last Name",
          type_label: "claimant"
        }
      ]
    },
    {
      id: 333333,
      document_file_name: "4020890_FileName.pdf",
      document_updated_at: "2020-07-08T19:41:28.385Z",
      document_type_label: "doc label",
      state: "rejected",
      details: [
        {
          id: 20657,
          type: "Fellow",
          name: "Fellow First Name Fellow Last Name",
          first_name: "Fellow First Name",
          last_name: "Fellow Last Name",
          type_label: "fellow"
        }
      ]
    },
    {
      id: 444444,
      document_file_name: "4020672_FileName.pdf",
      document_updated_at: "2020-07-08T19:41:28.385Z",
      document_type_label: "doc label",
      state: "rejected",
      details: [
        {
          id: 20656,
          type: "Claimant",
          name: "First Name Last Name",
          first_name: "First Name",
          last_name: "Last Name",
          type_label: "claimant"
        }
      ]
    }
  ];

// 原分组逻辑
const groups = [
    ...data
      .reduce(
        (detailMap, { id: docId, document_file_name, document_type_label, state, details = [] }) => {
          details.forEach(({ id, type, name }) => {
            const detail = detailMap.get(id) ?? { id, type, name, docs: [] };
            detail.docs.push({ docId, document_file_name, document_type_label, state });
            detailMap.set(id, detail);
          });
          return detailMap;
        },
        new Map()
      )
      .values()
  ];
console.log("groups: ", groups);

期望效果

以docId为222222的文档为例,期望的分组格式如下:

{
  "id": [{"id":20656},{"id":20657}],
  "name": [{"name":"First Name Last Name"},{"name": "Fellow First Name Fellow Last Name"}],
  "docs": [
    {
      "docId": 222222,
      "document_file_name": "4020653_FileName.pdf",
      "document_type_label": "doc label",
      "state": "accepted"
    }
  ]
}

修改后的代码

调整逻辑为按文档ID分组,确保每个文档仅保留一份,并整合所有关联人员信息:

const groupedByDoc = [
  ...data.reduce((docMap, doc) => {
    const docId = doc.id;
    // 初始化或获取已有文档分组条目
    const entry = docMap.get(docId) ?? {
      id: [],
      name: [],
      docs: [{
        docId: doc.id,
        document_file_name: doc.document_file_name,
        document_type_label: doc.document_type_label,
        state: doc.state
      }]
    };
    // 收集该文档关联的所有人员信息
    doc.details.forEach(person => {
      entry.id.push({ id: person.id });
      entry.name.push({ name: person.name });
    });
    docMap.set(docId, entry);
    return docMap;
  }, new Map()).values()
];

console.log("groupedByDoc: ", groupedByDoc);

逻辑说明

  • 以文档ID作为Map的键,确保每个文档只生成一个分组条目
  • 每个分组条目初始化时存入文档基础信息,避免重复存储
  • 遍历文档的关联人员列表,将人员的ID和姓名分别收集到对应数组中

内容的提问来源于stack exchange,提问作者Whoopcg

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 07:20:33