Here is an example flow of dynamically naming variables using a Set Variable component inside a For-Each loop.
This is a good way to persist data after the For-Each loop exits, since the payload resets to the payload before the For-Each scope is called.
<mule xmlns="http://www.mulesoft.org/schema/mule/core" xmlns:doc="http://www.mulesoft.org/schema/mule/documentation"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.mulesoft.org/schema/mule/core http://www.mulesoft.org/schema/mule/core/current/mule.xsd">
<flow name="dynamic-varsFlow" >
<scheduler doc:name="Scheduler" >
<scheduling-strategy >
<fixed-frequency frequency="10000"/>
</scheduling-strategy>
</scheduler>
<set-payload value='#[output application/json
var someInput = {
"data": [
{
"cardName": "cardName1",
"dataToMap": "first data"
},
{
"cardName": "cardName2",
"dataToMap": "2nd data"
},
{
"cardName": "cardName1",
"dataToMap": "2nd data for card name 1"
}
]
}
---
someInput.data]' doc:name="Set Payload" />
<foreach doc:name="For Each" >
<set-variable value='#[output application/json
var varName = payload.cardName as String
---
(if (vars[varName] != null)
vars[varName] ++ "** **" ++ payload.dataToMap
else
payload.dataToMap
)]' doc:name="Set Variable" variableName="#[payload.cardName]"/>
</foreach>
<foreach doc:name="Copy_of_For Each" >
<logger level="INFO" doc:name="Logger"
message="#[output application/json --- {varName: payload.cardName, varValue: vars[payload.cardName]}]"/>
</foreach>
</flow>
</mule>
`
Here are the log messages for each of the dynamically named vars inside the second For-Each loop. Notice there are two new vars dynamically named from the initial Set Payload data. In a more real-world flow, the payload would be read from the output of the Event Source, such as from an HTTP Connector or DB Connector:
Here is the payload and vars after the second For-Each scope is exited. The payload reverts back to it's initial value, but the changes made inside the first For-Each scope persist in the two vars: