【问题标题】:JQ: Reduce array of objects to object, adding to arrayJQ:将对象数组减少为对象,添加到数组
【发布时间】:2016-10-12 09:05:39
【问题描述】:

我有一个处理对象数组的更复杂的 JQ 表达式。

输入看起来像这样:

[
    { "key": "1", "value": "value 1"},
    { "key": "2", "value": "value 2"},
    { "key": "1", "value": "value 3"},
]

我想得到的是这样的:

{
    "1": { "values": ["value 1", "value 3"] },
    "2": { "values": ["value 2"] }
}

或者,对于我的用例:

{
    "1": [ "value 1", "value 3" ],
    "2": [ "value 2" ]
}

也可以。

我已经尝试使用… | { (.key): [.value] },但结果是(对我来说并不奇怪)后来出现的键只会覆盖已经存在的键。我想要完成的是“创建一个新的键/值对或将 .value 添加到已经存在的'values'数组中”。

【问题讨论】:

    标签: arrays json addition jq


    【解决方案1】:

    依赖group_by 的解决方案的缺点是group_by 需要排序,这在此处是不必要的。在这个响应中,我将展示如何通过使用一个通用的(并且通常有用的)jq 函数来避免任何排序,该函数“融合”一个 JSON 对象数组,主要是将每个键的值弹出到一个数组中,然后连接相应的数组。

    # input should be an array of objects
    def meld:
      reduce .[] as $o
        ({}; reduce ($o|keys)[] as $key (.; .[$key] += [$o[$key]] ));
    

    我们还要定义一些数据:

    def data:
    [
        { "key": "1", "value": "value 1"},
        { "key": "2", "value": "value 2"},
        { "key": "1", "value": "value 3"}
    ]
    ;
    

    然后是过滤器:

    data |  map([.] | from_entries) | meld
    

    产生:

    {"1":["value 1","value 3"],"2":["value 2"]}
    

    【讨论】:

      【解决方案2】:

      好的,在最终找到我想要的东西之后,我也明白我之前的过滤器没有保留输入数组,而是导致对象一个接一个地输出。所以这基本上就是我找到的所有示例都不起作用的原因。

      我想按键分组(因此有键/值要求),group_by 已经这样做了,但不起作用。

      从分组工作到我的解决方案(唯一键、数组中的值)只是一小步。

      '… group_by(.key) | map({ "key": .[0].key, "values": map(.value) | unique })'
      

      现在的输出看起来像这样,完全符合我的要求:

      [
          {
              "key": "1",
              "values": [
                  "value 1",
                  "value 3"
              ],
          },
          {
              "key": "2",
              "values": [
                  "value 2"
              ]
          }
      ]
      

      【讨论】:

        猜你喜欢
        • 2017-08-17
        • 2018-09-03
        • 1970-01-01
        • 1970-01-01
        • 2019-03-26
        • 1970-01-01
        • 1970-01-01
        • 2022-01-13
        • 2018-09-06
        相关资源
        最近更新 更多