如何根据过滤后的键生成documentItemToSigner数组?
问题解决:根据contentVersion生成对应数量的documentItemToSigner数组
需求
给定过滤后的数组,每个元素包含contentVersion、documentName及最多3组documentItemName{n}、typeCd{n}、subtypeCd{n}字段(n为1/2/3)。需根据每个contentVersion下存在的documentItemName{n}数量,生成对应数量的documentItemToSigner对象数组,每个对象映射对应字段并添加eSignLiveExtension属性(extractInd根据subtypeCd取值,示例中CAPTURE对应true,LABEL对应false)。
原始Payload
[ { "contentVersion": "068DQ000000lK0iYAE", "documentName": "ESRA with Exhibit_A", "documentItemName1": "Signature001", "typeCd1": "Signature", "typeCd2": null, "typeCd3": null, "subtypeCd1": "CAPTURE", "subtypeCd2": null, "subtypeCd3": null }, { "contentVersion": "068DQ000000kK0OYAU", "documentName": "Agreement 1", "documentItemName1": "Signature001", "documentItemName2": "Signature002", "typeCd1": "Signature", "typeCd2": "Signature", "typeCd3": null, "subtypeCd1": "CAPTURE", "subtypeCd2": "LABEL", "subtypeCd3": null }, { "contentVersion": "068DQ000000lK0OYAU", "documentName": "Agreement 2", "documentItemName1": "Signature001", "documentItemName2": "Signature002", "documentItemName3": "Signature003", "typeCd1": "Signature", "typeCd2": "Signature", "typeCd3": "Signature", "subtypeCd1": "CAPTURE", "subtypeCd2": "CAPTURE", "subtypeCd3": "CAPTURE" } ]
用户尝试的脚本
"documentItemToSigner": (payload filter ((g, index) -> g.contentVersion == "068DQ000000lK0OYAU")) map ((item, index) -> { "typeCd": item."typeCd{n}", "subtypeCd": item."subtypeCd{n}", "eSignLiveExtension": { "extractInd": true }, "documentItemName": item."documentItemName{n}" })
期望输出
{ "documentItemToSigner": [ { "typeCd": "Signature", "subtypeCd": "CAPTURE", "eSignLiveExtension": { "extractInd": true }, "documentItemName": "Signature001" }, { "typeCd": "Signature", "subtypeCd": "LABEL", "documentItemName": "Signature002", "eSignLiveExtension": { "extractInd": false } }, { "typeCd": "Signature", "subtypeCd": "CAPTURE", "eSignLiveExtension": { "extractInd": true }, "documentItemName": "Signature003" } ] }
解决方案
使用DataWeave脚本实现,核心逻辑是遍历1-3的序号,检查对应documentItemName{n}是否存在,存在则生成对应对象:
%dw 2.0 output application/json var targetContentVersion = "068DQ000000lK0OYAU" --- { documentItemToSigner: (payload filter ($.contentVersion == targetContentVersion)) flatMap ((item) -> (1 to 3) filter (n -> item["documentItemName$(n)"] != null) map ((n) -> { typeCd: item["typeCd$(n)"], subtypeCd: item["subtypeCd$(n)"], documentItemName: item["documentItemName$(n)"], eSignLiveExtension: { extractInd: item["subtypeCd$(n)"] == "CAPTURE" } }) ) }
关键说明
- 过滤目标条目:用
filter筛选出指定contentVersion的元素 - 遍历序号并检查有效性:通过
(1 to 3)遍历3个序号,用filter排除documentItemName{n}为null的条目 - 动态获取字段值:用
item["fieldName$(n)"]的语法动态拼接字段名,获取对应序号的字段值 - 设置extractInd:根据
subtypeCd的值判断,CAPTURE对应true,其他情况(如示例中的LABEL)对应false
内容的提问来源于stack exchange,提问作者veejay
相关产品推荐
相关产品推荐

