【问题标题】:Using jq to merge two arrays into one array of objects使用jq将两个数组合并为一个对象数组
【发布时间】:2021-03-23 11:21:04
【问题描述】:

我是 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"
   }
   ...
]

【问题讨论】:

  • 根对象中总是只有两个字段吗?
  • 举个例子很好,但如果你也描述了需求并向我们展示了你已经尝试过的东西会更好,这很可能也会对需求有所了解。

标签: json jq array-merge


【解决方案1】:

这是一个非常通用但几乎不可靠的解决方案:

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 } ]

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2017-04-24
      • 1970-01-01
      • 2018-10-25
      • 1970-01-01
      • 1970-01-01
      • 2019-06-18
      • 1970-01-01
      • 2017-02-04
      • 1970-01-01
      相关资源
      最近更新 更多