这是我的有效负载,这里我需要验证 details.addressDesc
数组中的
status字段是否处于活动状态
{
"id": "123",
"address": [
{
"type": "ABC",
"name": "name"
}
],
"details": [
{
"Firstname": "firstname1",
"lastname": "lastname1",
"addressDesc": [
{
"desc": "home",
"status": "active"
},
{
"desc": "office",
"status": "inactive"
}
]
},
{
"Firstname": "firstname2",
"lastname": "lastname2",
"addressDesc": [
{
"desc": "home",
"status": "inactive"
},
{
"desc": "office",
"status": "active"
}
]
},
{
"Firstname": "firstname3",
"lastname": "lastname3",
"addressDesc": [
{
"desc": "home",
"status": "active"
},
{
"desc": "office",
"status": "active"
}
]
}
]
}
如果
status is active
,则对应的 names(from details)
应与其 desc(details.addressDesc)
相连
如果 status 的所有元素都是 active,那么应该创建相应数量的 nameDetails (这里firstname3 的状态都是 active)
预期输出如下。
{
"addressDetails": [
{
"Firstname": "firstname1",
"lastname": "lastname1",
"addressName": "home",
"status": "active"
},
{
"Firstname": "firstname2",
"lastname": "lastname2",
"addressName": "office",
"status": "active"
},
{
"Firstname": "firstname3",
"lastname": "lastname3",
"addressName": "home",
"status": "active"
},
{
"Firstname": "firstname3",
"lastname": "lastname3",
"addressName": "office",
"status": "active"
}
]
}
对于这类问题,分步分解比较容易。首先获取您感兴趣的数组
payload.details
,然后技巧是每个元素映射的不是该元素而是嵌套的addressDesc
。对映射操作使用不同的名称允许使用父元素中的值。然后根据需要将map()转换为flatMap()或使用flatten()。
%dw 2.0
output application/json
---
payload.details flatMap ((detail, index) ->
detail.addressDesc
filter ($.status=="active")
map {
Firstname: detail.Firstname,
lastname: detail.lastname,
addressName: $.desc,
status: $.status
}
)
尝试下面的代码。
在这里,您可以迭代详细信息数组,然后迭代每个详细信息的addressDesc数组,并根据“活动”状态进行过滤。
%dw 2.0
output application/json
fun extractDetails(details) =
details flatMap ((detail) ->
detail.addressDesc filter ((desc) -> desc.status == "active") map ((activeDesc) ->
{
Firstname: detail.Firstname,
lastname: detail.lastname,
addressName: activeDesc.desc,
status: activeDesc.status
}
)
)
---
{
addressDetails: extractDetails(payload.details)
}