jsonjq

Sorting a JSON array by an arbitrary order using jq


Given this JSON data in the file data.json:

[
  { "id": 1, "entityType": "cat" },
  { "id": 2, "entityType": "dog" },
  { "id": 3, "entityType": "bird" },
  { "id": 4, "entityType": "cat" }
]

How would return an array sorted by some non-alphabetic arbitrary order (e.g dogs, birds and then cats)?

I've tried various permutations along the lines of:

jq --argjson order '["dog", "bird", "cat"]' '. | sort_by( index($order[], .entityType) )' data.json

but without any joy.


Solution

  • It's easier (and faster) to use an object for the order:

    jq --argjson order '{"dog":0, "bird":1, "cat":2}' \
        '. | sort_by($order[.entityType])'
    

    But if you insist:

    jq --argjson order '["dog", "bird", "cat"]' \
        '. | sort_by(.entityType as $type | ($order | index($type)))'