You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 18:58:16