无法使用数据编织过滤具有动态键的对象数组

Unable to filter Array of objects having dynamic keys using dataweave

我想根据 EmployeeStatus 过滤这个对象数组,它应该只是 Resigned and Terminated 而不是 活跃。这里每个对象的键都不同,因此我无法应用像 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
  }
]

您可以通过遍历结构来过滤记录。首先是一个数组,使用地图。每个元素都是一个具有单个键的对象,所以让我们使用 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": "rubyrichards@zylker.com",
        "Employeestatus": "Resigned"
      }
    ]
  },
  {
    "626433000000196184": [
      
    ]
  },
  {
    "626433000000196178": [
      
    ]
  },
  {
    "626433000000196166": [
      {
        "EmailID": "daveduken@zylker.com",
        "Employeestatus": "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"
      }
    ]
  }
]

脚本

%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"
  }
]

这是另一个镜头:

%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删除所有未通过正确断言的记录。