问题描述
我有一个任务,需要使用每个数组的一列,基于相同的值比较和过滤两个JSON
数组。因此,我使用了this问题的this答案。
但是,现在我需要比较匹配两个甚至三个列值的两个JSON
数组。
我已经尝试在另一个map
中使用一个db.code = file.code
,但是它不起作用。
示例可能是我使用的答案中的示例。比较db.name = file.nm
,db.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"
}
]
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