Search code examples
muledataweavemule-esb

How to break out of loop in filter, map etc in dataweave 1.0?


I think the question is pretty self explanatory. How to break out of a loop in map, filter and other such operators that loop? (or at least a workaround to achieve this)

Thanks


Solution

  • You're not going to be able to do it with any built-in functions like map, filter and reduce, so this leaves you with recursion. To emulate a break, your base case will need to check the array for length, as well as for the break condition. Here's an example that takes in an array and returns an array containing each value until an even number is reached:

    %dw 1.0
    output application/json
    
    %function breakCondition(n)
      mod(n, 2) == 0
    
    %function untilEven(arr, out=[])
      out when (isEmpty(arr) or breakCondition(arr[0]))
        otherwise untilEven(arr[1 to -1], arr[0])
    ---
    untilEven([3, 5, 1, 6, 7, 9])
    

    Returns:

    [3, 5, 1]
    

    For future reference, here is the same example in 2.0:

    %dw 2.0
    output application/json
    
    fun breakCondition(n) =
      mod(n, 2) == 0
    
    fun untilEven(arr, out=[]) =
      if (isEmpty(arr) or breakCondition(arr[0]))
        out
      else 
        untilEven(arr[1 to -1], arr[0])
    ---
    untilEven([3, 5, 1, 6, 7, 9])