无法使用数据编织过滤具有动态键的对象数组
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 文档的解释和链接:
- 我利用 dynamic elements 功能
{(data)}
销毁数组并将所有封闭的对象折叠成一个对象。
- 然后我使用
pluck
来获取数组中的值。
- 我利用
flatten
折叠第一层子数组,因为我们刚刚pluck
编辑的值也是数组。你现在有一个平面阵列。
- 现在我使用
filter
删除所有未通过正确断言的记录。
我想根据 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 文档的解释和链接:
- 我利用 dynamic elements 功能
{(data)}
销毁数组并将所有封闭的对象折叠成一个对象。 - 然后我使用
pluck
来获取数组中的值。 - 我利用
flatten
折叠第一层子数组,因为我们刚刚pluck
编辑的值也是数组。你现在有一个平面阵列。 - 现在我使用
filter
删除所有未通过正确断言的记录。