0

Scenario : Using groupBy method to group students by Roll Numbers. Then the objective is to iterate a list of roll Numbers from an input array and use each of the roll number as key to get the objects from the groupBy response.

problem : unable to use rollnumbers as a dynamic key when trying to fetch the data from the grouped students object.

INPUT:

[
    {
        "name": "ABC",
        "rollNumber": 123,
        "subject": "Maths",
        "marks": 80
    },
    {
        "name": "ABC",
        "rollNumber": 123,
        "subject": "ENG",
        "marks": 87
    },
    {
        "name": "BKB",
        "rollNumber": 324,
        "subject": "ENG",
        "marks": 80
    },
    {
        "name": "REW",
        "rollNumber": 543,
        "subject": "Maths",
        "marks": 80
    }
]

%dw 2.0
output application/json 
var studentsGroupedByRollNumbers = payload groupBy ((item, index) -> item.rollNumber)
var studentsToCheck = ["123","543"]
---
studentsToCheck map ((item, index) ->
    studentsGroupedByRollNumbers.($item) reduce ......


 )

Can anyone suggest a solution or an optimized approach for this please ? Thanks

Bibek Kr. Bazaz
  • 505
  • 10
  • 34

1 Answers1

1

When dynamic keys are a number then I think it conflicts with the accessing array-index key behavior. You could reconstruct the groupBy key to be non-numerical and then use it like below -

 %dw 2.0
output application/json

fun getKey(rollNumber:Number) = "RN-$(rollNumber)"
var data = [
    {
        "name": "ABC",
        "rollNumber": 123,
        "subject": "Maths",
        "marks": 80
    },
    {
        "name": "ABC",
        "rollNumber": 123,
        "subject": "ENG",
        "marks": 87
    },
    {
        "name": "BKB",
        "rollNumber": 324,
        "subject": "ENG",
        "marks": 80
    },
    {
        "name": "REW",
        "rollNumber": 543,
        "subject": "Maths",
        "marks": 80
    }
]

var groupedByRN = data groupBy ((item, index) -> getKey(item.rollNumber))
var studentsToCheck = [123,543]
---
studentsToCheck map ((rn, index) -> 
    groupedByRN[getKey(rn)] reduce ((item, accumulator = 0) -> accumulator + item.marks)
)
Manik Magar
  • 1,403
  • 2
  • 10
  • 20