【问题标题】:jq: map object if field existsjq:如果字段存在则映射对象
【发布时间】:2021-12-22 22:56:44
【问题描述】:

这是我的jq代码:

def pick_nationality:
  {nation: {country: .NACIONALITAT, code: "some code"} };

def pick_surname:
  {name: {surname: .SURNAME, code: "some code"} };

map([pick_nationality, pick_surname])

当输入对象上不存在某些.NACIONALITAT.SURNAME 时会出现问题:

{
  "SURNAME": "surname1"
}
{
  "NACIONALITAT": "nacionalitat1"
}

结果:

[
  [
    {
      "nation": {
        "country": null,
        "code": "some code"
      }
    },
    {
      "name": {
        "surname": "surname1",
        "code": "some code"
      }
    }
  ],
  [
    {
      "nation": {
        "country": "nacionalitat1",
        "code": "some code"
      }
    },
    {
      "name": {
        "surname": null,
        "code": "some code"
      }
    }
  ]
]

问题是当.NATIONALITAT 字段不存在时,我需要避免pick_natinality...

期望的结果是:

[
  [
    {
      "name": {
        "surname": "surname1",
        "code": "some code"
      }
    }
  ],
  [
    {
      "nation": {
        "country": "nacionalitat1",
        "code": "some code"
      }
    }
  ]
]

有什么想法吗?

【问题讨论】:

    标签: jq


    【解决方案1】:

    当相关字段缺失时,让函数不返回任何内容。

    def pick_nationality:
      select(.NACIONALITAT) |
      {nation: {country: .NACIONALITAT, code: "some code"} };
    
    def pick_surname: 
      select(.SURNAME) |
      {name: {surname: .SURNAME, code: "some code"} };
    
    map([pick_nationality, pick_surname])
    

    Demojqplay

    【讨论】:

      【解决方案2】:

      您可以将 del 用于相应的 null 值,例如

      jq -r 'del(.[][] | select(.nation.country == null and .name.surname== null))'
      

      Demo

      【讨论】:

        【解决方案3】:

        您可以在捕获值之前添加测试:

        def pick_nationality:
          if has("NACIONALITAT")
          then {nation: {country: .NACIONALITAT, code: "some code"} }
          else empty end;
        
        def pick_surname: 
          if has("SURNAME")
          then {name: {surname: .SURNAME, code: "some code"} }
          else empty end;
        
        map([pick_nationality, pick_surname])
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-08-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-06-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多