Jordi
Jordi

Reputation: 23257

jq: avoid empty arrays mapped field

Here my jq script:

def pick_nationality:
  select(.NACIONALITAT) |
  {nation: {country: .NACIONALITAT, code: "some code"} };

def pick_surname: 
  select(.SURNAME) |
  {name: {surname: .SURNAME, code: "some code"} };

def pick_extension:
  { use: "official", extension: [pick_nationality, pick_surname] };

map(pick_extension)

Input json is like:

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

However, sometimes any input objects don't contain any look up field:

{
  "field1": "value1"
}
{
  "field2": "value2"
}

Above script returns:

[
  {
    "use": "official",
    "extension": []
  },
  {
    "use": "official",
    "extension": []
  }
]

I'd like extension doesn't appear:

[
  {
    "use": "official"
  },
  {
    "use": "official"
  }
]

Any ideas?

Upvotes: 2

Views: 191

Answers (2)

Barbaros Özhan
Barbaros Özhan

Reputation: 65363

You can simply add

| del(..|select(. == []))

as a trailing to your script in order to remove all such empty arrays

Demo

Upvotes: 2

jpseng
jpseng

Reputation: 2210

extend your function pick_extension for the desired output:

def pick_extension:
  [pick_nationality, pick_surname] as $extension
  | { use: "official" }
  | if $extension | length > 0 then . + {extension: $extension} else . end;

If no extension could be picked, the empty array will no longer be added to the json object this way.

Upvotes: 1

Related Questions