从 json 数组数组中过滤值

问题描述 投票:0回答:2

这是我的有效负载,这里我需要验证 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"
        }
    ]
}
arrays json filter dataweave mule4
2个回答
0
投票

对于这类问题,分步分解比较容易。首先获取您感兴趣的数组

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
        }
)

0
投票

尝试下面的代码。

在这里,您可以迭代详细信息数组,然后迭代每个详细信息的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)
}
© www.soinside.com 2019 - 2024. All rights reserved.