使用Dataweave 2.0中的两个或多个列值比较两个JSON数组

问题描述

我有一个任务,需要使用每个数组的一列,基于相同的值比较和过滤两个JSON数组。因此,我使用了this问题的this答案。

但是,现在我需要比较匹配两个甚至三个列值的两个JSON数组。

我已经尝试在另一个map中使用一个db.code = file.code,但是它不起作用。

示例可能是我使用的答案中的示例。比较db.name = file.nmdb.id = file.identityvar db = [ { "CODE": "A11","NAME": "Alpha","ID": "C10000" },{ "CODE": "B12","NAME": "Bravo","ID": "B20000" },{ "CODE": "C11","NAME": "Charlie","ID": "C30000" },{ "CODE": "D12","NAME": "Delta","ID": "D40000" },{ "CODE": "E12","NAME": "Echo","ID": "E50000" } ] var file = [ { "IDENTITY": "D40000","NM": "Delta","CODE": "D12" },{ "IDENTITY": "C30000","NM": "Charlie","CODE": "C11" } ]

lag()

解决方法

看看这是否适合您

%dw 2.0
output application/json
var file = [
    {
        "IDENTITY": "D40000","NM": "Delta","CODE": "D12"
    },{
        "IDENTITY": "C30000","NM": "Charlie","CODE": "C11"
    }
]
var db = [
    {
        "CODE": "A11","NAME": "Alpha","ID": "C10000"
    },{
        "CODE": "B12","NAME": "Bravo","ID": "B20000"
    },{
        "CODE": "C11","NAME": "Charlie","ID": "C30000"
    },{
        "CODE": "D12","NAME": "Delta","ID": "D40000"
    },{
        "CODE": "E12","NAME": "Echo","ID": "E50000"
    }
]
---
file flatMap(v) -> ( 
    db filter (v.IDENTITY == $.ID and v.NM == $.NAME and v.CODE == $.CODE)
)

使用flatMap而不是map进行展平将在输出中获得更干净的数组,除非您期望每个file条目有多个匹配项,在这种情况下我会坚持使用map

,

您可以直接比较DW中的对象,因此可以将链接的解决方案修改为以下内容:

%dw 2.0
import * from dw::core::Arrays
output application/json
var db = [
    {
        "CODE": "A11","ID": "E50000"
    }
]  

var file = [
    {
        "IDENTITY": "D40000","CODE": "C11"
    }
]
---
db partition (e) -> file contains {IDENTITY:e.ID,NM:e.NAME,CODE:e.CODE}
,

您可以直接使用filter,也可以使用contains

db filter(value) -> file contains {IDENTITY: value.ID,NM: value.NAME,CODE: value.CODE}

这告诉您根据文件是否包含对象{IDENTITY: value.ID,CODE: value.CODE}来过滤db数组。但是,如果文件数组中的对象具有其他字段,您将不使用它们进行比较,则此方法将不起作用。使用以上内容,您可以更新过滤条件,以检查条件适用的文件数组中是否存在对象(使用数据选择器)。您可以在下面进行检查。

db filter(value) -> file[?($.IDENTITY==value.ID and $.NM == value.NAME and $.CODE == value.CODE)] != null