Same code with do; do basically gives you header --- body
%dw 2.0
fun filterValue(value) = value match {
case is Object -> filterKeyValuePairs(value)
case is Array -> $ map filterValue($) filter (not (isEmpty($)))
else -> value
}
fun filterKeyValuePairs(value) = value mapObject (value, key, index) -> do {
var filteredValue = filterValue(value)
---
((key): filteredValue) if (not isEmpty(filteredValue))
}
---
filterValue(payload)
And if you want to do it without a second function:
%dw 2.0
fun filterValue(value) = value match {
case is Object -> $ mapObject do {
var filteredVal = filterValue($)
---
(($$): filteredVal) if (not (isEmpty(filteredVal)))
}
case is Array -> $ map filterValue($) filter (not (isEmpty($)))
else -> value
}
---
filterValue(payload)
You could also consider changing it around a bit to take your filter as a function so you could filter on something other than empty values:
fun filterObjectAndArrays(value, fn: (v: Any) -> Boolean) = value match {
case is Object -> $ mapObject do {
var filteredVal = filterObjectAndArrays($, fn)
---
(($$): filteredVal) if (fn(filteredVal))
}
case is Array -> $ map filterObjectAndArrays($, fn) filter (fn($))
else -> value
}
---
//payload filterObjectAndArrays (not isEmpty($))
payload filterObjectAndArrays ($ != "a")
fun filterKeyValuePairs(value) = value mapObject (value, key, index) -> { ((key): filterValue(value)) if (not isEmpty(filterValue(value))) }- Learner