Эффективная замена значений в списке на основе значений из другого списка в муле Dataweave - PullRequest
1 голос
/ 04 апреля 2019

Требуется эффективное решение для замены значений в массиве 1 (основной список) на значения из массива 2. Текущий код работает в Dataweave.Но я не думаю, что это оптимальное решение, когда два списка содержат больше значений.Предложите оптимальное решение для обновления Array 1 со значениями из Array 2. Я использую Mule 3.8.5.Мне нужно решение, чтобы мне нужно было повторять только один раз во втором списке и заменять все значения в основном списке.В настоящее время условие фильтра используется дважды в образце.Но в реальном сценарии мне нужно заменить 8 таких значений.

%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


})

Приведенный выше код дает ожидаемый результат.Но это очень медленно, когда значения списка больше.

1 Ответ

1 голос
/ 04 апреля 2019

Привет, вам следует использовать groupBy, чтобы он индексировался по критериям, а затем каждый раз выполнять поиск вместо фильтра

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