1
votes

I need to compare 2 JSON arrays using Mule 4 dataweave 2.0 to get matching and un-matching outputs. The sample input JSON payload is given below:

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

This has to be compared to the below on ID/IDENTITY field.

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

My expected output is 2 variable arrays containing matching and un-matching objects:

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

3 Answers

3
votes

If that ID map is coming from somewhere else and you can't change its structure, I'd probably remap it and then use it like so:

%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")

which produces

{
  "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
votes

Hope this helps

%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
}

Sample Output

{
"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
votes

Here's another solution, albeit the previous two are solving your problem:

%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

Pick the one that perfoms the best and use it.