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

Compare two JSON arrays using two or more columns values in Dataweave 2.0

我有一项任务需要使用每个数组的一列基于相同的值比较和过滤两个 JSON 数组。所以我用了this answer of this问题。

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

我已经尝试在另一个内部使用一个 map,但是,它不起作用。

示例可能是我使用的答案中的示例。比较 db.code = file.codedb.name = file.nmdb.id = file.identity

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"
    }
]  



var file = [
    {
        "IDENTITY": "D40000",
        "NM": "Delta",
        "CODE": "D12"
    },
    {
        "IDENTITY": "C30000",
        "NM": "Charlie",
        "CODE": "C11"
    }
]

看看这是否适合你

%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",
        "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"
    }
]
---
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, NM: value.NAME, CODE: value.CODE} 来过滤 db 数组。但是,如果文件数组中的对象具有您不会用于比较的其他字段,这将不起作用。使用上面的内容,您可以更新过滤条件以检查文件数组中是否存在条件适用的对象(使用数据选择器)。您可以使用下面的内容进行检查。

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