{{announcement.body}}
{{announcement.title}}

Dataweave and the Reduce Operator: Part II

DZone 's Guide to

Dataweave and the Reduce Operator: Part II

:array to :object transformations let us create maps from which a certain club's name can be easily looked up. However, they can't be done with the map operator.

· Integration Zone ·
Free Resource

This post is a continuation of the series in which I am explaining the usage of the reduce operator of DataWeave.

Array to String - Obtaining an Aggregated String from an Array

Input Payload:

["A","B","C","D","E","F","G","H"]

Expected output: (Dasherized string)

"ABCDEFGH"

Accumulator: "" (Empty String into which elements will be concatenated).

Aggregate operation: ++ (Concat)

Dataweave Code: 

payload reduce ((character,acc="") -> acc ++ character )

Here character references each element of the array i.e. A, B, C and so on.

The expression acc ++ character adds each character subsequently into the accumulator which becomes the output at the end.

Array to Object - Obtaining an Aggregated Object/Map from an Array

Let's observe the following input payload and output payload required:

Input payload: 

[{
"ClubID": "A1234",
"Name": "Barcelona FC",
"Country": "Spain"
}, {
"ClubID": "B1234",
"Name": "Chelsea FC",
"Country": "Spain"
}, {
"ClubID": "C1234",
"Name": "Arsenal FC",
"Country": "Englanda"
}]

1. Output payload: a map/Object containing all the elements of the array with key as club ID and value as club name.

{
"A1234": "Barcelona FC",
"B1234": "Chelsea FC",
"C1234": "Arsenal FC"
}

This is basically an (array to object) transformation. This kind of transformation is very often required where we want to represent the data in terms of a unique ID from the payload so that the data can be extracted conveniently using the ID. After creation of this map (when application/java mime type is used in output), a particular club's name can be easily looked up. For example, payload["A1234"] will give you."Barcelona FC"

Transformation Details

Accumulator: {} (An empty object is chosen for the addition of subsequent elements resulting from the lambda expression) 

Aggregate operation: + (concatenate: to create a map by concatenating all elements resulting from the lambda, the aggregation will basically be a concatenation of multiple objects).

Dataweave code: 

payload reduce ((val, acc = {}) -> acc ++ (( { (val.ClubID) : ( val.Name ) } )))


2. If, however, the output required is : A map/Object of all the elements of the array with the key as Club ID and value as the rest of the club details. 

{
"A1234": {
"Name": "Barcelona FC",
"Country": "Spain"
},
"B1234": {
"Name": "Chelsea FC",
"Country": "England"
},
"C1234": {
"Name": "Arsenal FC",
"Country": "England"
}
}

In this case, we just need to modify the expression and keep the rest the same as the above transformation.

Dataweave code:

payload reduce ((val, acc = {}) -> acc ++ (( { (val.ClubID) : ( val - "ClubID" ) } )))

Advantage: Using the above transformation, we can easily look up all of the details of a particular club. For example, to get all the Club details of the Club with ID "A1234," we can specify it like this: payload["A1234"]. This will result in :

{
"Name": "Barcelona FC",
"Country": "Spain"
}

This type of transformation is very often used in the merging of different payloads with a common Unique ID.

Topics:
dataweave ,mulesoft ,reduce ,integration ,tutorial

Opinions expressed by DZone contributors are their own.

{{ parent.title || parent.header.title}}

{{ parent.tldr }}

{{ parent.urlSource.name }}