schibsted/jslt

map fields to an array preventing nulls

joaopastor opened this issue · 2 comments

Hey there,
how could I achieve the following:

Input:

{
  "id": 1,
  "field1": "val1",
  "field3": "val3"
}

Desired Output:

{
  "id" : 1,
  "fields" : [ 
    {
      "field_name" : "field1",
      "field_value" : "val1"
    }, 
    {
      "field_name" : "field3",
      "field_value" : "val3"
    }
  ]
}

Actual output:

{
  "id" : 1,
  "fields" : [ 
    {
      "field_name" : "field1",
      "field_value" : "val1"
    }, 
    null, 
    {
      "field_name" : "field3",
      "field_value" : "val3"
    }
  ]
}

using the following jslt:

{
  "id": .id,
  "fields": [
    if (.field1)
      {
      "field_name" : "field1",
      "field_value"  : .field1
      },
    if(.field2)
      {
        "field_name" : "field2",
        "field_value"  : .field2
      },
    if(.field3)
    {
      "field_name" : "field3",
      "field_value"  : .field3
    }
  ]
}

How could I do it so that I don't have nulls in the array?

larsga commented

You need to make the array first, then filter it.

Something like this:

let fields = [
    if (.field1)
      {
      "field_name" : "field1",
      "field_value"  : .field1
      },
    if(.field2)
      {
        "field_name" : "field2",
        "field_value"  : .field2
      },
    if(.field3)
    {
      "field_name" : "field3",
      "field_value"  : .field3
    }
  ] 

{
  "id": .id,
  "fields": [for ($fields) . if (.)]
}

thanks, works like a charm.