代码之家  ›  专栏  ›  技术社区  ›  Jordi

jq:映射对象(如果字段存在)

jq
  •  0
  • Jordi  · 技术社区  · 4 年前

    这是我的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 字段不存在。。。

    预期结果将是:

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

    有什么想法吗?

    1 回复  |  直到 4 年前
        1
  •  2
  •   ikegami Gilles Quénot    4 年前

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

    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])
    

    Demo 关于jqplay

        2
  •  1
  •   Barbaros Özhan    4 年前

    你可以用 德尔 分别为 无效的 价值观,比如

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

    Demo

        3
  •  1
  •   Philippe    4 年前

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

    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])