ghoshyTech
ghoshyTech

Reputation: 63

Efficiently replacing values in a list based on value from another list in mule Dataweave

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

Answers (1)

machaval
machaval

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

Related Questions