mike-neckのブログ

Java or Groovy or Swift or Golang

2つの配列をマージしてオブジェクトの配列を作る(How to merge/zip two arrays into an array in jq)

一瞬わからなくて、グーグルなどで検索したけどよくわからなかったものの、ドキュメントを読み直したら解けた。

これは、パイプラインを理解してないと思いつかないと思う。


次のようなオブジェクトがあり、 names と scores は同じ長さの配列かつ names は重複のない配列として、それらをマージして (name, score) を組みにしたオブジェクトを作るのが目標とする。

item:
  names:
  - foo
  - bar
  - baz
  scores:
  - 10
  - 20
  - 30

names と scores に名前を付けて参照可能にしておいて、 names をメインのイテレーターとしてインデックスを自身から取得して、そのインデックスで scores から score を取得する

.item.names as $names |
.item.scores as $scores |
[
  .item.names[] |
  . as $name |
  {
    name: .,
    score: $scores[
      $names | index($name)
    ]
  }
]