Select objects based on value of variable in object using jq Select objects based on value of variable in object using jq bash bash

Select objects based on value of variable in object using jq


Adapted from this post on Processing JSON with jq, you can use the select(bool) like this:

$ jq '.[] | select(.location=="Stockholm")' json{  "location": "Stockholm",  "name": "Walt"}{  "location": "Stockholm",  "name": "Donald"}


To obtain a stream of just the names:

$ jq '.[] | select(.location=="Stockholm") | .name' json

produces:

"Donald""Walt"

To obtain a stream of corresponding (key name, "name" attribute) pairs, consider:

$ jq -c 'to_entries[]        | select (.value.location == "Stockholm")        | [.key, .value.name]' json

Output:

["FOO","Donald"]["BAR","Walt"]


I had a similar related question: What if you wanted the original object format back (with key names, e.g. FOO, BAR)?

Jq provides to_entries and from_entries to convert between objects and key-value pair arrays. That along with map around the select

These functions convert between an object and an array of key-value pairs. If to_entries is passed an object, then for each k: v entry in the input, the output array includes {"key": k, "value": v}.

from_entries does the opposite conversion, and with_entries(foo) is a shorthand for to_entries | map(foo) | from_entries, useful for doing some operation to all keys and values of an object. from_entries accepts key, Key, name, Name, value and Value as keys.

jq15 < json 'to_entries | map(select(.value.location=="Stockholm")) | from_entries'{  "FOO": {    "name": "Donald",    "location": "Stockholm"  },  "BAR": {    "name": "Walt",    "location": "Stockholm"  }}

Using the with_entries shorthand, this becomes:

jq15 < json 'with_entries(select(.value.location=="Stockholm"))'{  "FOO": {    "name": "Donald",    "location": "Stockholm"  },  "BAR": {    "name": "Walt",    "location": "Stockholm"  }}