Reputation: 63
Need an efficient solution for replacing values in Array 1( Master List) with Values from Array 2. The current code works in Dataweave. But I don't think it is an optimal solution when the two lists contain more values. Suggest an optimal solution to update Array 1 with values from Array 2. I am using Mule 3.8.5. I want a solution so that I need to iterate only once within the second list and replace all values in the master list. Currently, the filter condition is used twice in the sample. But in the real scenario, I need to replace 8 such values.
%dw 1.0
%output application/java
%var arr1 =[
{
"leadId": 127,
"playerId": 334353,
"name": "Joseph",
"activity": "10/03/2015"
},
{
"leadId": 128,
"playerId": 334354,
"name": "Sam",
"activity": "10/03/2017"
},
{
"leadId": 124,
"playerId": "",
"name": "",
"activity": "10/03/2015"
},
{
"leadId": 123,
"playerId": "",
"name": "",
"activity": "10/03/2015"
}
]
%var arr2 = [
{
"playerId": 123456,
"name": "James",
"leadId": 124
},
{
"playerId": 7890,
"name": "Jacob",
"leadId": 123
}
]
---
arr1 map ((actData) -> {
"leadId":actData.leadId,
"playerId": (arr2 filter ($.leadId == actData.leadId))[0].playerId default actData.playerId,
"name": (arr2 filter ($.leadId == actData.leadId))[0].name default actData.name,
"activity": actData.activity
})
The above code gives the expected result. But it is very slow when the list values are more.
Upvotes: 1
Views: 290
Reputation: 5059
Hi you should use groupBy so it is indexed by a criteria and then do a lookup instead of a filter every time
%dw 1.0
%output application/json
%var arr1 =[
{
"leadId": 127,
"playerId": 334353,
"name": "Joseph",
"activity": "10/03/2015"
},
{
"leadId": 128,
"playerId": 334354,
"name": "Sam",
"activity": "10/03/2017"
},
{
"leadId": 124,
"playerId": "",
"name": "",
"activity": "10/03/2015"
},
{
"leadId": 123,
"playerId": "",
"name": "",
"activity": "10/03/2015"
}
]
%var arr2 = [
{
"playerId": 123456,
"name": "James",
"leadId": 124
},
{
"playerId": 7890,
"name": "Jacob",
"leadId": 123
}
]
%var arr2ByLeadId = arr2 groupBy $.leadId
---
arr1 map ((actData) -> {
"leadId":actData.leadId,
"playerId": arr2ByLeadId."$(actData.leadId)"[0].playerId default actData.playerId,
"name": arr2ByLeadId."$(actData.leadId)"[0].name default actData.name,
"activity": actData.activity
})
Upvotes: 1