如何在jq中展开对象属性?替代手动逐个指定属性的方法
在jq中实现类似JS Object Spread的写法
嘿,你问的这个需求刚好可以用jq里的对象展开特性解决,完全不用再手动逐个指定属性啦!
直接等效写法(jq 1.6+)
从jq 1.6版本开始,官方引入了和JS里...几乎一样的对象展开运算符,你可以直接用...来展开嵌套对象的所有属性。针对你的例子,命令可以改成这样:
echo '{"a": {"a1":1, "a2": 2}, "b": 3}' | jq '{...(.a), b}'
执行后会得到和你手动指定完全一致的结果:
{ "a1": 1, "a2": 2, "b": 3 }
这里的...(.a)就是把.a对象里的所有键值对展开到新对象中,再加上单独的b属性,完美替代手动逐个映射的写法。
旧版本jq的替代方案(jq <1.6)
如果你的jq版本还没升级到1.6,可以用reduce遍历键值对来实现同样的效果:
echo '{"a": {"a1":1, "a2": 2}, "b": 3}' | jq 'reduce (.a | keys[]) as $key ({}; .[$key] = .a[$key]) + {b}'
这个命令会先遍历.a的所有键,把每个键值对添加到空对象中,最后再和{b}合并,同样能得到目标结果。
扩展用法
这种展开写法还支持同时展开多个对象,比如你有多个嵌套对象需要合并:
echo '{"x": {"x1":10}, "y": {"y1":20}, "z":30}' | jq '{...(.x), ...(.y), z}'
输出会是:
{ "x1": 10, "y1": 20, "z": 30 }
内容的提问来源于stack exchange,提问作者nachocab
相关产品推荐
相关产品推荐

