桜技録

🐈🐈🐈🐈🐘

配列ではなくオブジェクトからjq select

{
  "045eb00f-e662-4c06-b1ea-052eeefe6307": {
    "name": "hoge",
    "score": 1078
  },
  "85ee1327-aee9-4645-bf01-e035ddfe7ee6": {
    "name": "fuga",
    "score": 961
  },
  "727c03fa-08d2-4fa3-9143-c64f5fc3d404": {
    "name": "piyo",
    "score": 1609
  }
}

エントリのコレクションを配列ではなく上のようにIDをキーとしたオブジェクトで表現したJSONがある。

ここからある条件に合致したエントリ(オブジェクトのメンバ)をjqで抽出するにはどうするか?

to_entries

to_entries を使うとオブジェクトを配列に変換することができる。

jq to_entries
[
  {
    "key": "045eb00f-e662-4c06-b1ea-052eeefe6307",
    "value": {
      "name": "hoge",
      "score": 1078
    }
  },
  {
    "key": "85ee1327-aee9-4645-bf01-e035ddfe7ee6",
    "value": {
      "name": "fuga",
      "score": 961
    }
  },
  {
    "key": "727c03fa-08d2-4fa3-9143-c64f5fc3d404",
    "value": {
      "name": "piyo",
      "score": 1609
    }
  }
]

オブジェクトのメンバを表すオブジェクト {"key": "キー", "value": "値"} を要素とする配列が手に入る。

配列になってしまえば後は select 関数が使える。

# scoreが1000以上のエントリのみ抽出
jq 'to_entries | map(select(1000 <= .value.score))'
[
  {
    "key": "045eb00f-e662-4c06-b1ea-052eeefe6307",
    "value": {
      "name": "hoge",
      "score": 1078
    }
  },
  {
    "key": "727c03fa-08d2-4fa3-9143-c64f5fc3d404",
    "value": {
      "name": "piyo",
      "score": 1609
    }
  }
]

from_entries

from_entries で逆方向の変換もできる。

# scoreが1000以上のエントリのみ抽出
jq 'to_entries | map(select(1000 <= .value.score)) | from_entries'
{
  "045eb00f-e662-4c06-b1ea-052eeefe6307": {
    "name": "hoge",
    "score": 1078
  },
  "727c03fa-08d2-4fa3-9143-c64f5fc3d404": {
    "name": "piyo",
    "score": 1609
  }
}