%dw 2.0
var firstInput = [
{ "bookId":"101",
"title":"world history",
"price":"19.99"
},
{
"bookId":"202",
"title":"the great outdoors",
"price":"15.99"
}
]
var secondInput = [
{
"bookId":"101",
"author":"john doe"
},
{
"bookId":"202",
"author":"jane doe"
}
]
output application/json
---
firstInput map (firstInputValue) ->
{
theId : firstInputValue.bookId as Number,
theTitle: firstInputValue.title,
thePrice: firstInputValue.price as Number,
(secondInput filter ($.*bookId contains firstInputValue.bookId) map (secondInputValue) -> {
theAuthor : secondInputValue.author
})
}
Merge Fields from Separate Objects
The DataWeave examples merge fields from separate input arrays. The first (firstInput) is a DataWeave variable that lists price by book ID, and the second (secondInput) lists authors by book ID. Each book has a unique bookId key.
The DataWeave scripts produce the same output. Both scripts use two map functions with a filter, and one of them also creates an alias for the bookId:
-
The first
mapfunction iterates over the elements of thefirstInputarray. As the function evaluates each element, a secondmapfunction uses a filter to identify any elements in the second array (secondInput) that match thefiltercriteria (secondInput filter ($.*bookId contains firstInputValue.bookId)). The filter returns an element fromsecondInputthat contains abookIdvalue that matches thebookIdvalue in thefirstInputelement. -
The second
mapfunction evaluates that filtered element and then usessecondInputValue.authorto select and populate the value of its"author"field in the object{author : secondInputValue.author}. -
filterlimits the scope of the secondmapfunction to objects in thesecondInputthat share the samebookId.
[
{
"theId": 101,
"theTitle": "world history",
"thePrice": 19.99,
"theAuthor": "john doe"
},
{
"theId": 202,
"theTitle": "the great outdoors",
"thePrice": 15.99,
"theAuthor": "jane doe"
}
]
As the next script shows, you can also write the same script using an id alias (created with using (id = firstInputValue.bookId)). The alias replaces the selector expression, firstInputValue.bookId, which is longer.
%dw 2.0
var firstInput = [
{ "bookId":"101",
"title":"world history",
"price":"19.99"
},
{
"bookId":"202",
"title":"the great outdoors",
"price":"15.99"
}
]
var secondInput = [
{
"bookId":"101",
"author":"john doe"
},
{
"bookId":"202",
"author":"jane doe"
}
]
output application/json
---
firstInput map (firstInputValue) -> using (id = firstInputValue.bookId)
{
theValue : id as Number,
theTitle: firstInputValue.title,
thePrice: firstInputValue.price as Number,
(secondInput filter ($.*bookId contains id) map (secondInputValue) -> {
theAuthor : secondInputValue.author
})
}
[
{
"theValue": 101,
"theTitle": "world history",
"thePrice": 19.99,
"theAuthor": "john doe"
},
{
"theValue": 202,
"theTitle": "the great outdoors",
"thePrice": 15.99,
"theAuthor": "jane doe"
}
]
Both scripts produce the same output.



