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

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

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

[
  {
    "626433000000196190": [
      {
        "EmailID": "[email protected]",
        "Employeestatus": "Resigned"
      }
    ]
  },
  {
    "626433000000196184": [
      {
        "EmailID": "[email protected]",
        "Employeestatus": "Active"
      }
    ]
  },
  {
    "626433000000196178": [
      {
        "EmailID": "[email protected]",
        "Employeestatus": "Active"
      }
    ]
  },
  {
    "626433000000196166": [
      {
        "EmailID": "[email protected]",
        "Employeestatus": "Terminated"
      }
    ]
  }
]

Обязательный вывод

[
  {
        "EmailID": "[email protected]",
        "Employeestatus": "Resigned"
  },
  {
        "EmailID": "[email protected]",
        "Employeestatus": "Terminated
  }
]

person Karthik    schedule 21.01.2021    source источник


Ответы (3)


Может быть, примерно так:

Ввод

[
  {
    "626433000000196190": [
      {
        "EmailID": "[email protected]",
        "Employeestatus": "Resigned"
      }
    ]
  },
  {
    "626433000000196184": [
      {
        "EmailID": "[email protected]",
        "Employeestatus": "Active"
      }
    ]
  },
  {
    "626433000000196178": [
      {
        "EmailID": "[email protected]",
        "Employeestatus": "Active"
      }
    ]
  },
  {
    "626433000000196166": [
      {
        "EmailID": "[email protected]",
        "Employeestatus": "Terminated"
      }
    ]
  }
]

Скрипт

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

Вывод

[
  {
    "EmailID": "[email protected]",
    "Employeestatus": "Resigned"
  },
  {
    "EmailID": "[email protected]",
    "Employeestatus": "Terminated"
  }
]
person Salim Khan    schedule 21.01.2021

Вот еще один дубль:

%dw 2.0
output application/json

var data = [
  {
    "626433000000196190": [
      {
        "EmailID": "[email protected]",
        "Employeestatus": "Resigned"
      }
    ]
  },
  {
    "626433000000196184": [
      {
        "EmailID": "[email protected]",
        "Employeestatus": "Active"
      }
    ]
  },
  {
    "626433000000196178": [
      {
        "EmailID": "[email protected]",
        "Employeestatus": "Active"
      }
    ]
  },
  {
    "626433000000196166": [
      {
        "EmailID": "[email protected]",
        "Employeestatus": "Terminated"
      }
    ]
  }
]
---
flatten({(data)} pluck $) filter not ($.Employeestatus == "Active")

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

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

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

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

%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": "[email protected]",
        "Employeestatus": "Resigned"
      }
    ]
  },
  {
    "626433000000196184": [
      
    ]
  },
  {
    "626433000000196178": [
      
    ]
  },
  {
    "626433000000196166": [
      {
        "EmailID": "[email protected]",
        "Employeestatus": "Terminated"
      }
    ]
  }
]
person aled    schedule 21.01.2021
comment
Привет, @aled .. Ни в коем случае нельзя удалить существующие ключи ?? .. Эти ключи мне больше не нужны .. Я просто хотел устранить сложность массива, находящегося между ними, чтобы для дальнейших манипуляций было легче мне использовать результирующую полезную нагрузку, которая является требуемым выходом, как я показал выше, в вопросе. Просто мне любопытно узнать, возможно ли это или нет - person Karthik; 21.01.2021
comment
pluck $ в конце скрипта должен помочь вам в этом. - person Salim Khan; 21.01.2021