使用jq将两个数组合并为一个对象数组

Using jq to merge two arrays into one array of objects

我是 jq 的新手,我想重塑我的 JSON 文件。

我有 JSON 结构如下:

{
   "a": [1, 2, 3, 4 ...],
   "b": [
      {
         "x": 1000,
         "value": 1
      },
      {
         "x": 1000,
         "value": 2
      },
      {
         "x": 1000,
         "value": 3
      }
      ...
   ]
}

我想知道如何使用 jq 获得这样的结果:

[
   {
      "value": 1,
      "from": "a",
   },
   {
      "value": 2,
      "from": "a"
   },
   ...
   {
      "value": 1,
      "from": "b"
   },
   {
      "value": 2,
      "from": "b"
   }
   ...
]

创建两个列表,一个来自 .a,一个来自 .b,并将它们与 + 合并。 在第一个列表中,创建对象 value: 设置为原始内容并添加 from: "a";在第二个列表中,从 .b 的元素中删除 .x 并再次添加 from.

jq '[.a[] | {value:(.), from: "a"}] + [.b[] | del(.x) + {from: "b"}]

这里有一个非常通用但不够健壮的解决方案:

map_values( if type == "array" 
            then map(if type == "object" then .value else . end) 
            else . end)
| [ keys_unsorted[] as $k
    | .[$k][] as $v
    | { value: $v, from: $k } ]