From 80f502f661229977311642d7c6940f923de85968 Mon Sep 17 00:00:00 2001 From: jbranchaud Date: Tue, 7 Mar 2023 15:10:31 -0600 Subject: [PATCH] Add Find All Objects In An Array Where Key Is Set as a jq TIL --- README.md | 3 +- ...ll-objects-in-an-array-where-key-is-set.md | 50 +++++++++++++++++++ 2 files changed, 52 insertions(+), 1 deletion(-) create mode 100644 jq/find-all-objects-in-an-array-where-key-is-set.md diff --git a/README.md b/README.md index f23d5a7..3d842d3 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ pairing with smart people at Hashrocket. For a steady stream of TILs, [sign up for my newsletter](https://crafty-builder-6996.ck.page/e169c61186). -_1290 TILs and counting..._ +_1291 TILs and counting..._ --- @@ -488,6 +488,7 @@ _1290 TILs and counting..._ - [Count Each Collection In A JSON Object](jq/count-each-collection-in-a-json-object.md) - [Count The Number Of Things In A JSON File](jq/count-the-number-of-things-in-a-json-file.md) - [Extract A List Of Values](jq/extract-a-list-of-values.md) +- [Find All Objects In An Array Where Key Is Set](jq/find-all-objects-in-an-array-where-key-is-set.md) - [Find All Objects With A Matching Key Value Pair](jq/find-all-objects-with-a-matching-key-value-pair.md) - [Reduce Object To Just Entries Of A Specific Type](jq/reduce-object-to-just-entries-of-a-specific-type.md) diff --git a/jq/find-all-objects-in-an-array-where-key-is-set.md b/jq/find-all-objects-in-an-array-where-key-is-set.md new file mode 100644 index 0000000..c9d2607 --- /dev/null +++ b/jq/find-all-objects-in-an-array-where-key-is-set.md @@ -0,0 +1,50 @@ +# Find All Objects In An Array Where Key Is Set + +Let's say we have a large array of objects. And the data in those objects, +while generally having the same shape, does not always have certain values set. + +For instance, here is some data where the `token` is sometimes set, sometimes +`null`, and sometimes missing altogether. + +```json +[ + { + "id": 1, + "token": "abc" + }, + { + "id": 3, + "token": null + }, + { + "id": 5 + }, + ... +] +``` + +We can find out how many objects in this collection have the `token` key set to +an actual value with [a `jq` query](https://stedolan.github.io/jq/manual) like +the following. + +```bash +jq '. | map(select(has("token") and .token != null)) | length' data.json +``` + +This maps over each object selecting those where it has `token` and `token` is +not `null`. + +We can instead produce the inverse count—those objects where `token` is not set +to a value—with the `not` operator. + +```bash +jq '. | map(select(has("token") and .token != null | not)) | length' data.json +``` + +If you want to inspect the array of objects that either of these queries filters down to, you can drop the `| length` part. + +```bash +jq '. | map(select(has("token") and .token != null))' data.json +``` + +Here is [a live example](https://jqterm.com/?query=.%20%7C%20map%28select%28has%28%22token%22%29%20and%20.token%20!%3D%20null%20%7C%20not%29%29).