Contact Us 1-800-596-4880

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. Before you begin, note that DataWeave version 2 (%dw 2.0) is for Mule 4 apps. For a Mule 3 app, refer to DataWeave version 1 (%dw 1.0) examples, within the Mule 3.9 documentation set. For other Mule versions, you can use the Mule Runtime version selector in the table of contents.

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 map function iterates over the elements of the firstInput array. As the function evaluates each element, a second map function uses a filter to identify any elements in the second array (secondInput) that match the filter criteria (secondInput filter ($.*bookId contains firstInputValue.bookId)). The filter returns an element from secondInput that contains a bookId value that matches the bookId value in the firstInput element.

  • The second map function evaluates that filtered element and then uses secondInputValue.author to select and populate the value of its "author" field in the object {author : secondInputValue.author}.

  • filter limits the scope of the second map function to objects in the secondInput that share the same bookId.

DataWeave Script:
%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
    })
  }
Output JSON:
[
  {
    "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.

DataWeave Script:
%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
    })
  }
Output JSON:
[
  {
    "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.