Skip to content

Basic Operations

Selecting values

Select one property from an object.

jq

echo '{"name":"Alice","age":34}' |
jq -r '.name'

JFTL

"$.name"

Output

"Alice"

Complete JFTL example

{
  "main": { "$": true, "data": "$_datasets.input", "out":
      "$.name"
  },
  "datasets": {
    "input": { "name": "Alice", "age": 34 }
  }
}

Filtering lists

Keep only records that satisfy a condition.

jq

echo '[{"name":"Alice","age":34},{"name":"Noah","age":22}]' |
jq 'map(select(.age > 28))'

JFTL

{ "$": true, "filter": "$py=_['age'] > 28" }

Output

[
  { "name": "Alice", "age": 34 }
]

Complete JFTL example

{
  "main": { "$": true, "data": "$_datasets.input", "out":
      { "$": true, "filter": "$py=_['age'] > 28" }
  },
  "datasets": {
    "input": [
          { "name": "Alice", "age": 34 },
          { "name": "Noah", "age": 22 }
        ]
  }
}

Mapping over lists

Apply a calculation to every value in an array.

jq

echo '[1,3,5,7]' |
jq 'map(. * 2)'

JFTL

{ "$": true, "map": "$py=_ * 2" }

Output

[ 2, 6, 10, 14 ]

Complete JFTL example

{
  "main": { "$": true, "data": "$_datasets.input", "out":
      { "$": true, "map": "$py=_ * 2" }
  },
  "datasets": {
    "input": [ 1, 3, 5, 7 ]
  }
}

Mapping over records

Turn a list of records into an object whose keys and values are calculated from each record.

jq

echo '{"items":[{"name":"Pear","price":1.25},{"name":"Plum","price":0.8}]}' |
jq '.items | map({(.name): (.price * 2)}) | add'

JFTL

{
  "$": true,
  "data": "$.items",
  "map": [ "$.name", "$py= _['price'] * 2"],
  "transform": "pairs_to_object"
}

Output

{ "Pear": 2.5, "Plum": 1.6 }

Complete JFTL example

{
  "main": { "$": true, "data": "$_datasets.input", "out": {
      "$": true,
      "data": "$.items",
      "map": [ "$.name", "$py= _['price'] * 2"],
      "transform": "pairs_to_object"
    }
  },
  "datasets": {
    "input": {
          "items": [
                  { "name": "Pear", "price": 1.25 },
                  { "name": "Plum", "price": 0.8 }
                ]
        }
  }
}

Sorting lists

Sort scalar values.

jq

echo '[8,2,5,1,9]' |
jq 'sort'

JFTL

"$py=sorted(_)"

Output

[ 1, 2, 5, 8, 9 ]

Complete JFTL example

{
  "main": { "$": true, "data": "$_datasets.input", "out":
      "$py=sorted(_)"
  },
  "datasets": {
    "input": [ 8, 2, 5, 1, 9 ]
  }
}

Filtering distinct values in a list

Remove duplicate values.

jq

echo '[3,1,3,2,1,4]' |
jq 'unique'

JFTL

Leveraging Python comprehension - creating a map based on the

"$py=[_[i] for i in range(len(_)) if _[i] not in _[:i]]"

Output

[ 1, 2, 3, 4 ]

Complete JFTL example

{
  "main": { "$": true, "data": "$_datasets.input", "out":
      "$py=[_[i] for i in range(len(_)) if _[i] not in _[:i]]"
  },
  "datasets": {
    "input": [3,1,3,2,1,4]
  }
}

Combining filters

Filter records and then select one property.

jq

echo '[{"name":"Alice","age":34},{"name":"Noah","age":22}]' |
jq 'map(select(.age > 28) | .name)'

JFTL

{
  "$": true,
  "foreach": { "in": "$", "if": "$py=_['age'] > 28", "out": "$.name" }
}

Output

[ "Alice" ]

Complete JFTL example

{
  "main": { "$": true, "data": "$_datasets.input", "out":
      {
        "$": true,
        "foreach": { "in": "$", "if": "$py=_['age'] > 28", "out": "$.name" }
      }
  },
  "datasets": {
    "input": [
          { "name": "Alice", "age": 34 },
          { "name": "Noah", "age": 22 }
        ]
  }
}

Splitting strings

Split a string and select the first word.

jq

echo '{"name":"Alice Smith"}' |
jq -r '.name | split(" ")[0]'

JFTL

"$py=_['name'].split(' ')[ 0 ]"

Output

"Alice"

Complete JFTL example

{
  "main": { "$": true, "data": "$_datasets.input", "out":
      "$py=_['name'].split(' ')[ 0 ]"
  },
  "datasets": {
    "input": { "name": "Alice Smith" }
  }
}

Conditional logic

Choose an output based on a condition.

jq

echo '{"name":"Noah","age":16}' |
jq -r 'if .age >= 18 then "Adult" else "Child" end'

JFTL

{
  "$": true,
  "case": [
    { "when": "$py=_['age'] >= 18", "then": "Adult" },
    { "else": "Child" }
  ]
}

Output

"Child"

Complete JFTL example

{
  "main": { "$": true, "data": "$_datasets.input", "out":
      {
        "$": true,
        "case": [
          { "when": "$py=_['age'] >= 18", "then": "Adult" },
          { "else": "Child" }
        ]
      }
  },
  "datasets": {
    "input": { "name": "Noah", "age": 16 }
  }
}

Handling null values

Remove null values from an array.

jq

echo '[2,null,4,null,6]' |
jq 'map(select(. != null))'

JFTL

{ "$": true, "filter": "$py=_ is not None" }

Output

[ 2, 4, 6 ]

Complete JFTL example

{
  "main": { "$": true, "data": "$_datasets.input", "out":
      { "$": true, "filter": "$py=_ is not None" }
  },
  "datasets": {
    "input": [ 2, null, 4, null, 6 ]
  }
}

Formatting output

Build a string from values in an object.

jq

echo '{"name":"Alice","age":34}' |
jq -r '"Name: \(.name), Age: \(.age)"'

JFTL

"Name: ${.name}, Age: ${.age}"

Output

"Name: Alice, Age: 34"

Complete JFTL example

{
  "main": { "$": true, "data": "$_datasets.input", "out":
      "Name: ${.name}, Age: ${.age}"
  },
  "datasets": {
    "input": { "name": "Alice", "age": 34 }
  }
}

Composing records

Create a new object from an existing object, including calculated fields.

jq

echo '{"name":"Alice","age":34}' |
jq '{name: .name, age: (.age + 5)}'

JFTL

{ "name": "$.name", "age": "$py=_['age'] + 5" }

Output

{ "name": "Alice", "age": 39 }

Complete JFTL example

{
  "main": { "$": true, "data": "$_datasets.input", "out":
      { "name": "$.name", "age": "$py=_['age'] + 5" }
  },
  "datasets": {
    "input": { "name": "Alice", "age": 34 }
  }
}