【问题标题】:How can I spread an object's properties in jq?如何在 jq 中传播对象的属性?
【发布时间】: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}'

【问题讨论】:

    标签: json object key jq


    【解决方案1】:

    您可以将对象添加在一起以组合它们的内容。如果左侧和右侧对象中都存在键,则右侧对象中的值将保留。

    echo '{"a": {"a1":1, "a2": 2}, "b": 3}' | jq '.a+{b}'
    {
      "a1": 1,
      "a2": 2,
      "b": 3
    }
    

    【讨论】:

      【解决方案2】:

      如果您想要一个完全通用的解决方案:

      [..|objects|with_entries(select(.value|type!="object"))]|add
      

      或者,如果您想要深度优先的方法,请将 add 替换为 reverse|add

      当然,上面的理解是add以有损的方式解决冲突。如果您不想要任何损失,请选择不同的方法来组合对象,或者根本不组合它们。

      【讨论】:

        【解决方案3】:

        这是一个只检查顶级值,而不按名称引用任何键的解决方案:

        with_entries(if .value|type=="object" then .value|to_entries[] else . end)
        

        例如,这会产生:

        {
          "a1": 1,
          "a2": 2,
          "b": 3
        }
        

        请注意,即使此解决方案没有明确使用 add,它也有类似的关于键冲突的警告。

        【讨论】:

          猜你喜欢
          • 2020-03-09
          • 2018-02-26
          • 1970-01-01
          • 2018-04-16
          • 1970-01-01
          • 1970-01-01
          • 2017-04-12
          • 1970-01-01
          • 2019-05-25
          相关资源
          最近更新 更多