Невозможно отфильтровать массив объектов, имеющих динамические ключи, с помощью dataweave

#mule #dataweave #mulesoft

#mule #dataweave #mulesoft

Вопрос:

Я хочу отфильтровать этот массив объектов на основе EmployeeStatus, который должен быть только отправлен в отставку и завершен, но не активен. Здесь ключи разные для каждого объекта, и, следовательно, я не могу применить логику like item.key.EmployeeStaus=="Resigned" or "Terminated" .Любые предложения или подсказки были бы полезны для меня.

Ввод полезной нагрузки

 [
  {
    "626433000000196190": [
      {
        "EmailID": "rubyrichards@zylker.com",
        "Employeestatus": "Resigned"
      }
    ]
  },
  {
    "626433000000196184": [
      {
        "EmailID": "morganfinely@zylker.com",
        "Employeestatus": "Active"
      }
    ]
  },
  {
    "626433000000196178": [
      {
        "EmailID": "jenniferjackson@zylker.com",
        "Employeestatus": "Active"
      }
    ]
  },
  {
    "626433000000196166": [
      {
        "EmailID": "daveduken@zylker.com",
        "Employeestatus": "Terminated"
      }
    ]
  }
]
 

Требуемый вывод

 [
  {
        "EmailID": "rubyrichards@zylker.com",
        "Employeestatus": "Resigned"
  },
  {
        "EmailID": "daveduken@zylker.com",
        "Employeestatus": "Terminated
  }
]
 

Ответ №1:

Может быть, что-то вроде этого:

Входные данные

 [
  {
    "626433000000196190": [
      {
        "EmailID": "rubyrichards@zylker.com",
        "Employeestatus": "Resigned"
      }
    ]
  },
  {
    "626433000000196184": [
      {
        "EmailID": "morganfinely@zylker.com",
        "Employeestatus": "Active"
      }
    ]
  },
  {
    "626433000000196178": [
      {
        "EmailID": "jenniferjackson@zylker.com",
        "Employeestatus": "Active"
      }
    ]
  },
  {
    "626433000000196166": [
      {
        "EmailID": "daveduken@zylker.com",
        "Employeestatus": "Terminated"
      }
    ]
  }
]
 

Скрипт

 %dw 2.0
output application/json
---
flatten(payload   map 
     ($  mapObject {
          b: $ filter ($.Employeestatus != "Active") 
     }).b -[])
 

Вывод

 [
  {
    "EmailID": "rubyrichards@zylker.com",
    "Employeestatus": "Resigned"
  },
  {
    "EmailID": "daveduken@zylker.com",
    "Employeestatus": "Terminated"
  }
]
 

Ответ №2:

Вот еще один пример:

 %dw 2.0
output application/json

var data = [
  {
    "626433000000196190": [
      {
        "EmailID": "rubyrichards@zylker.com",
        "Employeestatus": "Resigned"
      }
    ]
  },
  {
    "626433000000196184": [
      {
        "EmailID": "morganfinely@zylker.com",
        "Employeestatus": "Active"
      }
    ]
  },
  {
    "626433000000196178": [
      {
        "EmailID": "jenniferjackson@zylker.com",
        "Employeestatus": "Active"
      }
    ]
  },
  {
    "626433000000196166": [
      {
        "EmailID": "daveduken@zylker.com",
        "Employeestatus": "Terminated"
      }
    ]
  }
]
---
flatten({(data)} pluck $) filter not ($.Employeestatus == "Active")
 

Я добавлю пояснения позже.

РЕДАКТИРОВАТЬ: вот объяснение и ссылки на документацию DW:

  1. Я использую функцию dynamic elements {(data)} для уничтожения массива и свертывания всех вложенных объектов в объект.
  2. Затем я использую pluck для получения только значений в массиве.
  3. Я использую flatten для свертывания первого уровня вложенных массивов, потому что значения, которые мы только pluck что отредактировали, также являются массивами. Теперь у вас есть плоский массив.
  4. Теперь я использую filter для удаления удаления всех записей, которые не соответствуют утверждению справа.

Ответ №3:

Вы можете отфильтровать записи, пересмотрев структуру. Сначала массив, используя map. Каждый элемент представляет собой объект с одним ключом, поэтому давайте используем MapObject, затем filter . Я не пытался удалить пустые массивы.

 %dw 2.0
output application/json skipNullOn="everywhere"
fun filterEmployeeStatus(e) = e filter ($.Employeestatus == "Resigned" or $.Employeestatus == "Terminated")
---
payload map 
    ( $ mapObject ((value, key, index) -> (key): filterEmployeeStatus(value) ) )
 

Вывод:

 [
  {
    "626433000000196190": [
      {
        "EmailID": "rubyrichards@zylker.com",
        "Employeestatus": "Resigned"
      }
    ]
  },
  {
    "626433000000196184": [
      
    ]
  },
  {
    "626433000000196178": [
      
    ]
  },
  {
    "626433000000196166": [
      {
        "EmailID": "daveduken@zylker.com",
        "Employeestatus": "Terminated"
      }
    ]
  }
]
 

Комментарии:

1. Привет, @aled.. Мы никак не можем удалить присутствующие ключи ?? .. Эти ключи мне больше не нужны .. Я просто хотел устранить сложность массива, присутствующего между ними, чтобы для дальнейших манипуляций мне было легче использовать результирующую полезную нагрузку, которая является требуемым результатом, как я показал выше в вопросе.. Просто мне любопытно узнать, возможно ли это или нет

2. выщипывание $ в конце скрипта должно помочь вам в этом.