按嵌套数组键分组时避免文档重复的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
相关产品推荐
相关产品推荐

