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.
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.
Opinions expressed by DZone contributors are their own.