如何获取 Dataweave 2.0 中某个键匹配的所有值?

问题描述

有效载荷:

[
{
    "Contacts": "123456,098765","Emails" : ""
},{
    "Contacts": "ABC123","Emails" : ""
}
]

如何从以下对象数组中获取所有电子邮件的列表,其中联系人 ID 与有效负载中的每一行相匹配? (下面的预期输出

可变accConts

{
    "queryResponse": [
        {
            "Email": "test123@test.com","SalesforceId": "123456"
        },{
            "Email": "test@test.com","SalesforceId": "098765"
            
        },{
            "Email": "ABC@test.com","SalesforceId": "ABC123"
            
        }

    ]
}

预期输出

[
{
    "Contacts": "123456,"Emails" : "test123@test.com,test@test.com"
},"Emails" : "ABC@test.com"
}
]

解决方法

HTH..

%dw 2.0
output application/json



var qResp ={
    "queryResponse": [
        {
            "Email": "test123@test.com","SalesforceId": "123456"
        },{
            "Email": "test@test.com","SalesforceId": "098765"
            
        },{
            "Email": "ABC@test.com","SalesforceId": "ABC123"
            
        }

    ]
}


--- 


payload filter ($.Contacts != null) map using (iter = $$) {
    "Contacts" : $.Contacts,"Emails": (qResp.queryResponse filter (payload[iter].Contacts contains $.SalesforceId)) reduce ((item,acc = "") ->  (acc ++ "," ++ item.Email)[1 to -1]
    )

}


,

我接受了 Salim Khan 的回答,因为他指导我朝着正确的方向以及让电子邮件起作用的逻辑。我只需要重新设计地图逻辑,

Option Explicit

Sub copyNonAdjacentColumns()
    ' Constants
    Const sCols As String = "A:A,C:C,F:F"
    ' Workbook
    Dim wb As Workbook: Set wb = ThisWorkbook ' workbook containing this code
    ' Source
    Dim sws As Worksheet: Set sws = wb.Worksheets("Sheet1")
    Dim sLastRow As Long
    sLastRow = sws.Range("A" & sws.Rows.Count).End(xlUp).Row
    Dim srg As Range
    Set srg = Intersect(sws.Range(sCols),sws.Rows("2:" & sLastRow))
    ' Destination
    Dim dws As Worksheet: Set dws = wb.Worksheets("Sheet2")
    Dim dCell As Range: Set dCell = dws.Range("A2")
    ' Copy
    srg.Copy dCell ' A,C,F to A,B,C
End Sub
,

希望这个comaprision有帮助

Works fine

Results in error

,

想要添加一个稍微简洁的解决方案来展示另一种方法。

%dw 2.0
output application/json

var qResp =
{
    "queryResponse": [
        {
            "Email": "test123@test.com","SalesforceId": "ABC123"
            
        }

    ]
}

--- 

payload map (value) ->
    {
        'Contacts':value.Contacts,'Emails': qResp.queryResponse[?(value.Contacts contains $.SalesforceId)]..Email joinBy ","
    }