问题描述
我有以下有效负载,我需要从中提取 Error[] != null 的行以及 Id 和 Date 与错误行的 Id 和 Date 匹配的所有其他行。
[
{
"Id": "123","Date": "1/1/2021","line": "ABC","Error": ["Some Error 1","Some Error 2"]
},{
"Id": "123","line": "CDB","Error": []
},"Date": "2/2/2021","Error": []
}
]
从上面的数组,我需要得到行
这里的期望输出应该是:
[
{
"Id": "123","Error": []
}
]
由于第二个对象的 Id 和日期与 Error != null 的第一个对象匹配,我需要将所有这些放入一个数组中。
如何实现所需的输出负载? 我能够过滤出 Error != null 的行,但如何获取所有其他行,其中 Id 和 Date 与错误行匹配?
解决方法
通过两个过滤器实现了这一点。首先过滤以查找所有与错误相关的日期数组。查找原始数组中所有具有相同日期的实例并组合成数组:
%dw 2.0
output application/json
var data = [
{
"Id": "123","Date": "1/1/2021","line": "ABC","Error": ["Some Error 1","Some Error 2"]
},{
"Id": "123","line": "CDB","Error": []
},"Date": "2/2/2021","Error": []
}
]
---
/*An array of dates that contain Error information with default [] to
* account for instances where no errors are present
*/
(data filter (not isEmpty($.Error))) default []
// Filter the data again to add find all objects with that Date and add to
// an array
reduce ((item,acc=[]) -> acc ++ (data filter (item.Date == $.Date and item.Id == $.Id)))
,
你可以试试这个方法。
%dw 2.0
output application/json
---
(payload groupBy ($.Id) mapObject {
($ groupBy ($.Date) mapObject {
($$):$
})
})[0]
另一种方法,但我不喜欢在 groupBy 中连接
%dw 2.0
output application/json
---
payload filter ($.Error != null) groupBy ($.Id ++ "_" ++ $.Date) mapObject {
($$):$
}