Skip to content

Latest commit

 

History

History
129 lines (109 loc) · 3.47 KB

dataweave-cookbook-conditional-list-reduction-via-function.adoc

File metadata and controls

129 lines (109 loc) · 3.47 KB

Example: Conditional List Reduction Via a Function

This example flattens the input to something simpler. For each element in the input, it conditionally includes a "contentTypes" field only in case it has any values. It then rearranges this content into a more readable shape.

The example uses these functions:

  • map to go through every element in the input array.

  • reduce to aggregate the multiple elements in the "tags" array into one field.

  • splitBy to parse the values in the "tags" array, so as to only select the first part of each string (through [0]) and discard the second.

  • ++ to concatenate these elements into one single string, with commas as separators.

  • if include the last field only if the "contentTypes" array is bigger than 0.

DataWeave
%dw 2.0
output application/json
fun
reduceMapFor(data) data reduce(($$ splitBy ":")[0] ++ "," ++ ($ splitBy ":")[0])
---
payload.results map
    {
        email: $.profile.email,
        name: $.profile.firstName,
        tags: reduceMapFor($.data.interests.tags[0]),
        (contenttypes: reduceMapFor($.data.interests.contenttypes[0])) if (sizeOf($.data.interests.contenttypes[0])) > 0
    }
Input JSON
{
  "results": [
    {
      "profile": {
        "firstName": "john",
        "lastName": "doe",
        "email": "[email protected]"
      },
      "data": {
        "interests": [
          {
            "language": "English",
            "tags": [
              "digital-strategy:Digital Strategy",
              "innovation:Innovation"
            ],
            "contenttypes": []
          }
        ]
      }
    },
    {
      "profile": {
        "firstName": "jane",
        "lastName": "doe",
        "email": "[email protected]"
      },
      "data": {
        "interests": [
          {
            "language": "English",
            "tags": [
              "tax-reform:Tax Reform",
              "retail-health:Retail Health"
            ],
            "contenttypes": [
              "News",
              "Analysis",
              "Case studies",
              "Press releases"
            ]
          }
        ]
      }
    }
  ],
  "objectsCount": 2,
  "totalCount": 2,
  "statusCode": 200,
  "errorCode": 0,
  "statusReason": "OK"
}
Output JSON
[
  {
    "email": "[email protected]",
    "name": "john",
    "tags": "digital-strategy,innovation"
  },
  {
    "email": "[email protected]",
    "name": "jane",
    "tags": "tax-reform,retail-health",
    "contenttypes": "News,Analysis,Case studies,Press releases"
  }
]