如何在 jq 中展开对象的属性?

5
如果我需要访问一个对象的属性,目前我是手动访问每个属性:
echo '{"a": {"a1":1, "a2": 2}, "b": 3}' | jq '{a1:.a.a1, a2: .a.a2,b}'
{
  "a1": 1,
  "a2": 2,
  "b": 3
}

我希望避免指定每个属性。在JS中是否有与Object展开运算符等效的东西,例如jq '{...a, b}'

3个回答

8
您可以将对象相加以合并它们的内容。如果左侧和右侧对象中都存在某个键,则来自右侧对象的值将保留。
echo '{"a": {"a1":1, "a2": 2}, "b": 3}' | jq '.a+{b}'
{
  "a1": 1,
  "a2": 2,
  "b": 3
}

1
如果你想要一个完全通用的解决方案:
[..|objects|with_entries(select(.value|type!="object"))]|add

如果你想使用深度优先的方法,将 add 替换为 reverse|add
当然,以上前提是要理解 add 以一种有损的方式解决冲突。如果你不希望有任何的损失,请选择其他合并对象的方法,或者干脆不要合并它们。

1
这里有一个解决方案,只检查顶层值,而不引用任何特定的键名:
with_entries(if .value|type=="object" then .value|to_entries[] else . end)

例如,这会产生以下结果:
{
  "a1": 1,
  "a2": 2,
  "b": 3
}

请注意,尽管此解决方案未明确使用add,但它仍存在与键冲突相关的类似警告。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接