Home > database >  JOLT - Sort array objects depending on keys values
JOLT - Sort array objects depending on keys values

Time:01-07

I would like to sort the objects of an array depending on specific values of 2 keys. In particular I would like to sort by a specific kpiId value, and for the objects having that kpiId value, sort by the simulationId values. This iterates twice.

Input

{
  "kpiResults": [
    {
      "simulationId": 3939,
      "kpiId": 81,
      "startTime": "2022-01-05T10:20:47",
      "value": 2
    },
    {
      "simulationId": 3936,
      "kpiId": 80,
      "startTime": "2022-01-05T10:20:47",
      "value": 1
    },
    {
      "simulationId": 3940,
      "kpiId": 80,
      "startTime": "2022-01-05T10:20:47",
      "value": 12
    },
    {
      "simulationId": 3940,
      "kpiId": 81,
      "startTime": "2022-01-05T10:20:47",
      "value": 88
    },
    {
      "simulationId": 3937,
      "kpiId": 80,
      "startTime": "2022-01-05T10:20:47",
      "value": 32
    },
    {
      "simulationId": 3939,
      "kpiId": 80,
      "startTime": "2022-01-05T10:20:47",
      "value": 11
    },
    {
      "simulationId": 3938,
      "kpiId": 80,
      "startTime": "2022-01-05T10:20:47",
      "value": 12
    },
    {
      "simulationId": 3938,
      "kpiId": 81,
      "startTime": "2022-01-05T10:20:47",
      "value": 6
    },
    {
      "simulationId": 3936,
      "kpiId": 81,
      "startTime": "2022-01-05T10:20:47",
      "value": 4
    },
    {
      "simulationId": 3937,
      "kpiId": 81,
      "startTime": "2022-01-05T10:20:47",
      "value": 21
    }
  ]
}

Desired Output (sort by kpiId=80,simulationId then sort by kpiId=81,simulationId)

{
  "kpiResults": [
    {
      "simulationId": 3936,
      "kpiId": 80,
      "startTime": "2022-01-05T10:20:47",
      "value": 1
    },
    {
      "simulationId": 3937,
      "kpiId": 80,
      "startTime": "2022-01-05T10:20:47",
      "value": 32
    },
    {
      "simulationId": 3938,
      "kpiId": 80,
      "startTime": "2022-01-05T10:20:47",
      "value": 12
    },
    {
      "simulationId": 3939,
      "kpiId": 80,
      "startTime": "2022-01-05T10:20:47",
      "value": 11
    },
    {
      "simulationId": 3940,
      "kpiId": 80,
      "startTime": "2022-01-05T10:20:47",
      "value": 12
    },
    {
      "simulationId": 3936,
      "kpiId": 81,
      "startTime": "2022-01-05T10:20:47",
      "value": 4
    },
    {
      "simulationId": 3937,
      "kpiId": 81,
      "startTime": "2022-01-05T10:20:47",
      "value": 21
    },
    {
      "simulationId": 3938,
      "kpiId": 81,
      "startTime": "2022-01-05T10:20:47",
      "value": 6
    },
    {
      "simulationId": 3939,
      "kpiId": 81,
      "startTime": "2022-01-05T10:20:47",
      "value": 2
    },
    {
      "simulationId": 3940,
      "kpiId": 81,
      "startTime": "2022-01-05T10:20:47",
      "value": 88
    }
  ]
}

Any help with the required JOLT spec would be appreciated. Cheers M

CodePudding user response:

You can apply sort transformation after making combination of kpiId and simulationId values object key names, and then remove them :

[
  {
    "operation": "shift",
    "spec": {
      "kpiResults": {
        "*": "@(0,kpiId).@(0,simulationId)"
      }
    }
  },
  {
    "operation": "sort"
  },
  {
    "operation": "shift",
    "spec": {
      "*": {
        "*": "kpiResults"
      }
    }
  }
]

enter image description here

  •  Tags:  
  • Related