The module dw::core::Arrays
has extra functions that are useful when working with arrays in DataWeave. In this post we will look at the functions splitAt
and splitWhere
. We can use these functions to split an array into two arrays. The result of both functions is actually a Pair
type, which is defined as an object with the keys l
and r
. An example is { "l": 1, "r": 2 }
which we can read as the left side of the pair has value 1
and the right side of the pair has value 2
. The result of the splitAt
and splitWhere
function will have one part of the split array in the left side of the pair and the rest of the array in the right side.
The splitAt
function takes the array as first argument and an index value as second argument. The index value should indicate at which position the array should be split. The function can be used with infix notation as well. The splitWhere
function takes as first argument also an array, but the second argument is a predicate function. All items starting from the first item for which the predicate function returns true
will be assigned to the r
key of the Pair
result, and all preceding items to the l
key. We can use the infix notation here as well.
In the following example code we use the splitAt
and splitWhere
function on an array:
Source
%dw 2.0 import splitWhere, splitAt from dw::core::Arrays output application/json --- { // Split the range at index 4. splitAt: (0 to 8) splitAt 4, // Split at the position where the predicate returns true for the first time. splitWhere: (0 to 8) splitWhere ((item) -> item > 5) }
Output
{ "splitAt": { "l": [ 0, 1, 2, 3 ], "r": [ 4, 5, 6, 7, 8 ] }, "splitWhere": { "l": [ 0, 1, 2, 3, 4, 5 ], "r": [ 6, 7, 8 ] } }
Although the function work on arrays we can use them on a object as well. We first turn the object into an array of objects with a single key and value using the pluck
function. We can use this array with the splitAt
and splitWhere
functions. Then we can use the reduce
function to transform the values in the Pair
to an object with multiple keys and values again.
In the next example we use this mechanism on an object:
Source
%dw 2.0 import splitWhere, splitAt from dw::core::Arrays // Helper functions // ---------------- // Transform object to array with key/value pairs fun objectToArray(obj: Object): Array<Object> = obj pluck ((value, key) -> (key): value) // Transform array with key/value pairs to object fun arrayToObject(items: Array<Object>): Object = items reduce ((item, acc = {}) -> acc ++ item) var obj = { language: "DataWeave", alias: "mrhaki", age: 48, country: "NL" } output application/json --- { // We can use splitAt on object if we first transform an object // to an array of key/value pairs, apply the splitAt function and // transform the resulting Pair into an object again. splitAtObject: objectToArray(obj) splitAt 3 mapObject ((value, key) -> (key): arrayToObject(value)), // We can use splitWhere in the same manner for objects. splitWhereObject: objectToArray(obj) splitWhere ((item) -> typeOf(item[0]) == Number) mapObject ((value, key) -> (key): arrayToObject(value)) }
Output
{ "splitAtObject": { "l": { "language": "DataWeave", "alias": "mrhaki", "age": 48 }, "r": { "country": "NL" } }, "splitWhereObject": { "l": { "language": "DataWeave", "alias": "mrhaki" }, "r": { "age": 48, "country": "NL" } } }
Written with DataWeave 2.4.