如何从另一个数组创建一个数组,其中某些键与 Dataweave 2.0 中的值匹配?

问题描述

我有以下有效负载,我需要从中提取 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": []
  }
]

从上面的数组,我需要得到行

  1. 错误[] != null
  2. 获取日期和 ID 与 Error != null 的对象匹配的所有其他行

这里的期望输出应该是:

[
  {
    "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 {
    ($$):$
}

enter image description here