如何使用DataWeave过滤数组对象并按条件提取签署项数据?
需求与实现方案
现有数据
原始JSON数组如下:
{ "documentToSigner": [ { "documentName": "ESRA 适用于 aa aa", "typeCd": "SIGNATURE", "subtypeCd": "CAPTURE", "eSignLiveExtension": { "extractInd": true }, "documentItemName": "Signature001" }, { "documentName": "ODP 协议", "typeCd": "SIGNATURE", "subtypeCd": "CAPTURE", "eSignLiveExtension": { "extractInd": true }, "documentItemName": "Signature002" }, { "documentName": "ODP 协议", "typeCd": "INPUT", "subtypeCd": "LABEL", "eSignLiveExtension": { "extractInd": true, "autoFieldBindingCd": "{approval.signed}" }, "documentItemName": "SignatureDate002" } ] }
核心需求
结合另一个包含key和contentVersion字段的JSON变量,过滤出原始数组中与这两个字段匹配的项,再按documentName分组,生成包含documentItemToSigner数组的目标结构。
示例
匹配参数
- 目标key:
aAuDQ0000004mX60AI - 目标contentVersion:
068DQ000000lK0iYAE
期望输出
[ { "documentName": "ESRA 适用于 cc cc", "documentItemToSigner": [ { "typeCd": "SIGNATURE", "subtypeCd": "CAPTURE", "eSignLiveExtension": { "extractInd": true }, "documentItemName": "Signature001" } ] }, { "documentName": "ODP 协议", "documentItemToSigner": [ { "typeCd": "SIGNATURE", "subtypeCd": "CAPTURE", "eSignLiveExtension": { "extractInd": true }, "documentItemName": "Signature004" }, { "typeCd": "INPUT", "subtypeCd": "LABEL", "eSignLiveExtension": { "extractInd": true, "autoFieldBindingCd": "{approval.signed}" }, "documentItemName": "SignatureDate004" } ] } ]
实现代码(JavaScript)
// 原始数据(需确保每个项包含key和contentVersion字段) const originalData = { "documentToSigner": [ { "documentName": "ESRA 适用于 aa aa", "typeCd": "SIGNATURE", "subtypeCd": "CAPTURE", "eSignLiveExtension": { "extractInd": true }, "documentItemName": "Signature001", "key": "aAuDQ0000004mX60AI", "contentVersion": "068DQ000000lK0iYAE" }, { "documentName": "ODP 协议", "typeCd": "SIGNATURE", "subtypeCd": "CAPTURE", "eSignLiveExtension": { "extractInd": true }, "documentItemName": "Signature002", "key": "aAuDQ0000004mX60AI", "contentVersion": "068DQ000000lK0iYAE" }, { "documentName": "ODP 协议", "typeCd": "INPUT", "subtypeCd": "LABEL", "eSignLiveExtension": { "extractInd": true, "autoFieldBindingCd": "{approval.signed}" }, "documentItemName": "SignatureDate002", "key": "aAuDQ0000004mX60AI", "contentVersion": "068DQ000000lK0iYAE" } ] }; // 目标匹配参数 const targetKey = "aAuDQ0000004mX60AI"; const targetContentVersion = "068DQ000000lK0iYAE"; // 1. 过滤出匹配key和contentVersion的项 const matchedItems = originalData.documentToSigner.filter(item => item.key === targetKey && item.contentVersion === targetContentVersion ); // 2. 按documentName分组,生成目标结构 const result = Object.values(matchedItems.reduce((groupedData, item) => { const { documentName, ...itemDetails } = item; if (!groupedData[documentName]) { groupedData[documentName] = { documentName, documentItemToSigner: [] }; } groupedData[documentName].documentItemToSigner.push(itemDetails); return groupedData; }, {})); console.log(JSON.stringify(result, null, 2));
内容的提问来源于stack exchange,提问作者veejay
相关产品推荐
相关产品推荐

