【发布时间】:2021-02-12 18:30:00
【问题描述】:
如果我需要访问对象的属性,我目前正在手动访问每个属性:
echo '{"a": {"a1":1, "a2": 2}, "b": 3}' | jq '{a1:.a.a1, a2: .a.a2,b}'
{
"a1": 1,
"a2": 2,
"b": 3
}
我想避免指定每个属性。 JS中是否有相当于对象扩展运算符,例如jq '{...a, b}'?
【问题讨论】:
如果我需要访问对象的属性,我目前正在手动访问每个属性:
echo '{"a": {"a1":1, "a2": 2}, "b": 3}' | jq '{a1:.a.a1, a2: .a.a2,b}'
{
"a1": 1,
"a2": 2,
"b": 3
}
我想避免指定每个属性。 JS中是否有相当于对象扩展运算符,例如jq '{...a, b}'?
【问题讨论】:
您可以将对象添加在一起以组合它们的内容。如果左侧和右侧对象中都存在键,则右侧对象中的值将保留。
echo '{"a": {"a1":1, "a2": 2}, "b": 3}' | jq '.a+{b}'
{
"a1": 1,
"a2": 2,
"b": 3
}
【讨论】:
如果您想要一个完全通用的解决方案:
[..|objects|with_entries(select(.value|type!="object"))]|add
或者,如果您想要深度优先的方法,请将 add 替换为 reverse|add。
当然,上面的理解是add以有损的方式解决冲突。如果您不想要任何损失,请选择不同的方法来组合对象,或者根本不组合它们。
【讨论】:
这是一个只检查顶级值,而不按名称引用任何键的解决方案:
with_entries(if .value|type=="object" then .value|to_entries[] else . end)
例如,这会产生:
{
"a1": 1,
"a2": 2,
"b": 3
}
请注意,即使此解决方案没有明确使用 add,它也有类似的关于键冲突的警告。
【讨论】: