如何解决无法使用 dataweave 过滤具有动态键的对象数组
我想根据 EmployeeStatus 过滤这个对象数组,它应该只是 Resigned and Terminated 而不是 active。这里每个对象的键都不同,因此我无法应用 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",{
"626433000000196166": [
{
"EmailID": "daveduken@zylker.com","Employeestatus": "Terminated"
}
]
}
]
所需输出
[
{
"EmailID": "rubyrichards@zylker.com","Employeestatus": "Resigned"
},{
"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",{
"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": "Terminated"
}
]
}
]
---
flatten({(data)} pluck $) filter not ($.Employeestatus == "Active")
我稍后会添加说明。
编辑:以下是 DW 文档的解释和链接:
- 我利用 dynamic elements 特性
{(data)}
销毁数组并将所有封闭的对象折叠为一个对象。 - 然后我使用
pluck
只获取数组中的值。 - 我使用
flatten
来折叠第一级子数组,因为我们刚刚pluck
ed 的值也是数组。您现在有了一个平面阵列。 - 现在我使用
filter
来删除所有未通过右侧断言的记录。
您可以通过遍历结构来过滤记录。首先是一个数组,使用 map。每个元素都是一个具有单个键的对象,所以让我们使用 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",{
"626433000000196184": [
]
},{
"626433000000196178": [
]
},"Employeestatus": "Terminated"
}
]
}
]
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。