我有下面的json:
[ { "a": 10, "b": 20 }, { "a": 11, "c": 30, }, { "b": 21, "c": 31 } ]
我需要创建一个新的json对象,其中包含不同数组条目中的所有键,但具有累积值。大概是这样的:
{ "a": 21, "b": 41, "c": 61 }
数组元素可以更多,键可以是任何东西。我该怎么做呢?这可能用jq或者其他工具实现吗?
hlswsv351#
假设数组只有平面对象,你可以使用to_entries来覆盖它们的键值对,并将它们添加到reduce折叠中:
to_entries
reduce
reduce (.[] | to_entries[]) as {$key, $value} ({}; .[$key] += $value )
Demo
dy1byipe2#
如果你有一组任意嵌套的对象,流它选择叶值,你可以把路径的最后一部分作为键。
reduce (tostream|select(length==2)|.[0]|=last) as [$key, $value] ({}; .[$key] += $value )
yi0zb3m43#
另一种使用group_by(demo)的方法:
group_by
map(to_entries[]) | group_by(.key) | map({ key : first.key, value : ( reduce .[].value as $item (0; . + $item) ) } ) | from_entries
3条答案
按热度按时间hlswsv351#
假设数组只有平面对象,你可以使用
to_entries
来覆盖它们的键值对,并将它们添加到reduce
折叠中:Demo
dy1byipe2#
如果你有一组任意嵌套的对象,流它选择叶值,你可以把路径的最后一部分作为键。
yi0zb3m43#
另一种使用
group_by
(demo)的方法: