比较2个JSON数组以获得匹配和不匹配的输出。

问题描述 投票:0回答:1

我需要使用Mule 4 dataweave 2.0对2个JSON数组进行比较,以获得匹配和不匹配的输出.输入JSON有效载荷的示例如下。

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

这必须与下面的IDIDENTITY字段进行比较。

[
    {
        "IDENTITY": "D40000",
        "NM": "Delta"
    },
    {
        "IDENTITY": "C30000",
        "NM": "Charlie"
    }
]

我的预期输出是2个包含匹配和不匹配对象的变量数组。

varMatch: 
[
    {
        "CODE": "C11",
        "NAME": "Charlie",
        "ID": "C30000"
    },
    {
        "CODE": "D12",
        "NAME": "Delta",
        "ID": "D40000"
    }
]
varUnmatch:
[
    {
        "CODE": "A11",
        "NAME": "Alpha",
        "ID": "C10000"
    },
    {
        "CODE": "B12",
        "NAME": "Bravo",
        "ID": "B20000"
    },
    {
        "CODE": "E12",
        "NAME": "Echo",
        "ID": "E50000"
    }
]
mule mule-studio dataweave mule-component anypoint-studio
1个回答
3
投票

如果这个ID映射来自其他地方,而你又不能改变它的结构,我可能会重新映射它,然后像这样使用。

%dw 2.0
output application/json

var identMap = [
    {
        "IDENTITY": "D40000",
        "NM": "Delta"
    },
    {
        "IDENTITY": "C30000",
        "NM": "Charlie"
    }
]

var remapped = identMap reduce ((item,accum={}) -> accum ++ (item.IDENTITY): 1)

---
payload groupBy (if (remapped[$.ID]?) "varMatched" else "varUnmatched")

这样就会产生

{
  "varUnmatched": [
    {
      "CODE": "A11",
      "NAME": "Alpha",
      "ID": "C10000"
    },
    {
      "CODE": "B12",
      "NAME": "Bravo",
      "ID": "B20000"
    },
    {
      "CODE": "E12",
      "NAME": "Echo",
      "ID": "E50000"
    }
  ],
  "varMatched": [
    {
      "CODE": "C11",
      "NAME": "Charlie",
      "ID": "C30000"
    },
    {
      "CODE": "D12",
      "NAME": "Delta",
      "ID": "D40000"
    }
  ]
}

3
投票

希望能帮到你

%dw 2.0
var input1=[{
    "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 input2=[
{
    "IDENTITY": "D40000",
    "NM": "Delta"
},
{
    "IDENTITY": "C30000",
    "NM": "Charlie"
}
]
var varMatch =   input1 map $ filter (input2.IDENTITY contains $.ID)
var varUnmatch = input1 -- varMatch
output application/json
---
{
varMatch:   varMatch,
varUnmatch: varUnmatch
}

采样输出

{
"varMatch": [
{
  "CODE": "C11",
  "NAME": "Charlie",
  "ID": "C30000"
},
{
  "CODE": "D12",
  "NAME": "Delta",
  "ID": "D40000"
}
],
"varUnmatch": [
{
  "CODE": "A11",
  "NAME": "Alpha",
  "ID": "C10000"
},
{
  "CODE": "B12",
  "NAME": "Bravo",
  "ID": "B20000"
},
{
  "CODE": "E12",
  "NAME": "Echo",
  "ID": "E50000"
}
]
}

3
投票

这里还有一个解决方案,尽管前面两个都在解决你的问题。

%dw 2.0
output application/dw
var data = [
    {
        "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 searchData = [
    {
        "IDENTITY": "D40000",
        "NM": "Delta"
    },
    {
        "IDENTITY": "C30000",
        "NM": "Charlie"
    }
]
---
data dw::core::Arrays::partition (e) -> searchData.*IDENTITY contains e.ID

选一个最适合你的,然后用它。

© www.soinside.com 2019 - 2024. All rights reserved.