json 使用jq对未知键的值求和

f8rj6qna  于 2023-10-21  发布在  其他
关注(0)|答案(3)|浏览(119)

我有下面的json:

[
  {
    "a": 10,
    "b": 20
  },
  {
    "a": 11,
    "c": 30,
  },
  {
    "b": 21,
    "c": 31
  }
]

我需要创建一个新的json对象,其中包含不同数组条目中的所有键,但具有累积值。大概是这样的:

{
  "a": 21,
  "b": 41,
  "c": 61
}

数组元素可以更多,键可以是任何东西。
我该怎么做呢?这可能用jq或者其他工具实现吗?

hlswsv35

hlswsv351#

假设数组只有平面对象,你可以使用to_entries来覆盖它们的键值对,并将它们添加到reduce折叠中:

reduce (.[] | to_entries[]) as {$key, $value} ({};
  .[$key] += $value
)
{
  "a": 21,
  "b": 41,
  "c": 61
}

Demo

dy1byipe

dy1byipe2#

如果你有一组任意嵌套的对象,流它选择叶值,你可以把路径的最后一部分作为键。

reduce (tostream|select(length==2)|.[0]|=last) as [$key, $value] ({};
  .[$key] += $value
)
yi0zb3m4

yi0zb3m43#

另一种使用group_bydemo)的方法:

map(to_entries[]) 
| group_by(.key)
| map({ key : first.key, value : ( reduce .[].value as $item (0; . + $item) ) } )
| from_entries

相关问题