En jq los números se pueden comparar con los siguientes operadores relacionales y de igualdad.
| Comparación | Operador |
|---|---|
| Mayor que | a > b |
| Mayor o igual que | a >= b |
| Menor que | a < b |
| Menor o igual que | a <= b |
| Igual a | a == b |
| Distinto de | a != b |
El resultado de la comparación siempre es un valor booleano, es decir, true o false.
1 < 3, # => true
2 != 2, # => false
1 == 1.0 # => true
# All numbers are floating-points, so this is different syntax
# for the exact same value.
Los operadores de comparación anteriores también se pueden usar para comparar strings. En ese caso, se aplica un orden de diccionario (lexicográfico). El orden se basa en el valor del punto de código Unicode.
"Apple" > "Pear", # => false
"a" < "above", # => true
"a" == "A" # => false
Debes tener cuidado cuando compares dos variables que parecen contener valores numéricos pero son de tipo string. Debido al orden de diccionario, el resultado no será el mismo que al comparar valores de tipo número.
10 < 2, # => false
"10" < "2" # => true (because "1" comes before "2")
El operador == de jq es como el === de Javascript en el sentido de que dos cosas que «parecen» iguales, pero son de tipos diferentes, no son iguales.
"3" == 3 # => false
# the value on the left has type string,
# the value on the right has type number.
Dos arrays son iguales si todos los elementos correspondientes son iguales.
[1, 2, 3] == [1, 2, 3] # => true
[1, 2, 3] == [1, 3, 2] # => false, different order
[1, 2, 3] == [1, 2, "3"] # => false, different types
Dos objetos son iguales si tienen los mismos pares clave-valor.
{name: "Joe", age: 42} == {age: 42, name: "Joe"} # => true
{name: "Joe", age: 42} == {age: 42, name: "Jane"} # => false
{name: "Joe", age: 42} == {age: "42", name: "Joe"} # => false
{name: "Joe", age: 42} == {age: 42, name: "Joe", height: 175} # => false
# comparisons will drill down as deeply as required
{a: {b: {c: [1, 2]}}} == {a: {b: {c: [1, 2]}}} # => true
{a: {b: {c: [1, 2]}}} == {a: {b: {c: [1, 2, 3]}}} # => false
La expresión condicional de jq es if A then B else C end.
if-then-else es un filtro como todas las funciones integradas de jq: recibe una entrada y produce una salida.
Si la expresión A produce un valor verdadero, el filtro if evalúa B.
En caso contrario, evalúa C.
La entrada del filtro if se pasa a B o a C.
42 | if . < 50 then "small" else "big" end # => "small"
5 | if . % 2 == 0 then . / 2 else . * 4 end # => 20
La cláusula else es opcional; las dos instrucciones siguientes son equivalentes.
if A then B else . end
if A then B end
Se pueden añadir más condiciones con elif.
42 | if . < 33 then "small"
elif . < 66 then "medium"
else "big"
end
# => "medium"
Usa tantas cláusulas elif como necesites.
Los únicos valores «falsos» en jq son: false y null.
Todo lo demás es «verdadero», incluso el número cero y el string vacío, el array vacío y el objeto vacío.
Los operadores booleanos and y or se pueden usar para construir consultas complejas.
42 | if . < 33 or . > 66 then "big or small"
else "medium"
end
Para negar, usa not. Es un filtro, no un operador.
42 | if (. < 33 or . > 66 | not) then "medium"
else "big or small"
end
El operador de alternativa te permite especificar un valor «predeterminado» si una expresión es falsa o nula.
A // B
# This is identical to
if A then A else B end
Para demostrarlo
[3, 5, 18] | add / 2 # => 13
[] | add / 2 # => error: null (null) and number (2) cannot be divided
[] | add // 0 / 2 # => 0
En este ejercicio vas a escribir algo de código que te ayude a prepararte para comprar un vehículo.
Tienes tres tareas: determinar si vas a necesitar un permiso de conducir, elegir entre dos vehículos y calcular el precio aceptable de un vehículo de segunda mano.
Algunos tipos de vehículos necesitan un permiso de conducir para poder manejarlos.
Supón que solo los tipos "car" y "truck" requieren permiso; todo lo demás se puede manejar sin permiso.
Implementa la función needs_license, que toma el tipo de vehículo y devuelve un valor booleano que indica si necesitas un permiso para ese tipo de vehículo.
"car" | needs_license
# => true
"bike" | needs_license
# => false
Has evaluado tus opciones de vehículos disponibles.
Has conseguido reducirlas a dos opciones, pero necesitas ayuda para tomar la decisión final.
Implementa la función choose_vehicle, que toma como entrada un array de dos vehículos y devuelve una decisión: la opción que aparece primero en orden alfabético.
["Wuling Hongguang", "Toyota Corolla"] | choose_vehicle
# => "Toyota Corolla is clearly the better choice."
["Volkswagen Beetle", "Volkswagen Golf"] | choose_vehicle
# => "Volkswagen Beetle is clearly the better choice."
Ahora que has tomado tu decisión, quieres asegurarte de conseguir un precio justo en el concesionario. Como te interesa comprar un vehículo de segunda mano, el precio depende de la antigüedad del vehículo. Para una estimación aproximada, supón que si el vehículo tiene menos de 3 años, cuesta el 80 % del precio original que tenía cuando era nuevo. Si tiene más de 10 años, cuesta el 50 %. Si el vehículo tiene al menos 3 años, pero no más de 10, cuesta el 70 % del precio original.
Implementa la función resell_price, que aplica esta lógica usando if, elif y else.
Toma un objeto que contiene el precio original y la antigüedad del vehículo, y devuelve el precio estimado en el concesionario.
{"original_price": 1000, "age": 1} | resell_price
# => 800
{"original_price": 1000, "age": 5} | resell_price
# => 700
{"original_price": 1000, "age": 15} | resell_price
# => 500
Regístrate en Exercism para aprender y dominar jq con 12 conceptos75 ejercicios y mentoría humana real, todo gratis.