Say you're iterating over a list of objects in jq:

  {"foo": "bar", "other":  "attributes"},
  {"foo": "baz", "should": "be filtered"}

and you are only interested in operating on the attribute foo:

jq ".[].foo"

will not give you two distinct objects:


but not a new list. So whatever you do, the next pipeline will operate on each single object. For example jq ".[].foo | length" is the length of each string:


To get everything back into an array, you have to wrap the first pipeline into [] in the correct place:

$ jq "[.[].foo] | length"

evaluates to


I know this might be obvious to most people but for me it was really hard to wrap [sic!] my head around. So I decided to publish a blog post as a cheat-sheet for myself. 😄