%dw 2.0
output application/json
var myData = [{name:1},{name:2},{name:3}]
fun myExternalFunction(data): Array =
if(data.name == 1)
[]
else if(data.name == 2)
[{name: 3}, {name:5}]
else
[data]
---
//flatten(myData map ((item, index) -> myExternalFunction(item)))
myData flatMap ((item, index) -> myExternalFunction(item))
Map and Flatten an Array
The flatMap
function calls map
on an input and wraps the results
in a call to flatten
.
The flatMap
function is useful for refactoring uses of flatten
on the results of a
call to map
. For example, review the following DataWeave script:
The header of the script creates a variable myData
to define an array of
objects, each with the key name
. It also defines a function with a set of
if-else statements that act on name-value pairs with the key name
.
The body of the DataWeave script contains the following expressions, each of which produces the same result:
-
flatten(myData map ((item, index) → myExternalFunction(item)))
-
myData flatMap ((item, index) → myExternalFunction(item))
Whether you use the flatMap
expression or explicitly use flatten
to wrap the
map
expression, the following takes place:
-
The expression maps the items in the input array according to if-else conditions in the function
myExternalFunction()
, which is defined in the header.The mapping produces the following output:
[ [ ], [ { "name": 3 }, { "name": 5 } ], [ { "name": 3 } ] ]
-
The expression flattens the mapped results by consolidating the elements from the subarrays into a single array, removing the parent array and eliminating the empty child array.
Flattening produces the following output:
Output JSON:[ { "name": 3 }, { "name": 5 }, { "name": 3 } ]