'Compare multiple fields in a single array and have conditions on their values

I need to compare two fields in a array and replace their values with different data and output in separate objects

Here is my sample input array:

{
    "data": [
    {
      "house": "house1",
      "condition": "bad",
      "age": "old",

    },
    {
      "house": "house2",
      "condition": "good",
      "age": "new",
    }
  ]
}

Output should be

  {
      "data": [
        {
          "house": "house1",
          "condition": "repair"
    
        },
        {
          "house": "house1",
          "age": "over50",
        },
        {
          "house": "house2",
          "condition": "No repair",
        },
        {
          "house": "house2",
          "age": "recent"
        }
      ]
    }

If condition is "bad" I need to replace with "repair" else if condition is "good" I need to replace with "No repair". Same type of logic. for the age field. If age is "old" I need to replace with "Over50" and if age is "new" I need to replace with "recent". The two fields(age and condition) are going to be in every iteration



Solution 1:[1]

As aled suggested, Map would do this along with OrderBy.

%dw 2.0
output application/json
var a=payload.data
---
"data":(a map{
    "house": $.house,
    "condition":if (($.condition)=="bad") "repair" else "No repair"
} ++ (a map{
    "house": $.house,
    "age":if (($.age)=="old") "over50" else "recent"
})orderBy $.house)

Output

{
  "data": [
    {
      "house": "house1",
      "condition": "repair"
    },
    {
      "house": "house1",
      "age": "over50"
    },
    {
      "house": "house2",
      "condition": "No repair"
    },
    {
      "house": "house2",
      "age": "recent"
    }
  ]
}

Solution 2:[2]

Alternative solution with a single map (you map to an array of the 2 objects required and then flatten the result):

%dw 2.0
output application/json
fun mapCondition(cond : String) = if (cond == "bad") "repair" else "No repair"
fun mapAge(age : String) = if (age == "old") "over50" else "recent"
---
{ 
    data : flatten(payload.data 
        map ((item, index) -> 
        [   
            {
                house: item.house, 
                condition: mapCondition(item.condition)
            }, 
            {
                house: item.house, 
                age: mapAge(item.age)
            }
        ]))
}

Solution 3:[3]

Use map() over data array and use if conditions to transform the field of each element inside the map. Seems pretty direct.

Solution 4:[4]

You can also apply map and flatten with a single call to flatMap.

%dw 2.0
output application/json
---
data: payload.data flatMap [
    {
        house: $.house,
        condition: $.condition match {
            case 'bad' -> 'Repair'
            else -> 'No Repair'
        }
    },
    {
        house: $.house,
        age: $.age match {
            case 'old' -> 'over50'
            else -> 'new'
        }
    }
]

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1
Solution 2 afelisatti
Solution 3 aled
Solution 4 MrM