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 de arriba también se pueden usar para comparar strings. En ese caso, se aplica un orden de diccionario (lexicográfico). El orden es por el valor del punto de código Unicode.
"Apple" > "Pear", # => false
"a" < "above", # => true
"a" == "A" # => false
Ten 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 number.
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 las 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 todos los builtins de jq: recibe una entrada y produce una salida.
Si la expresión A produce un valor «truthy», entonces el filtro if evalúa B.
De lo contrario, evalúa C.
La entrada del filtro if se pasará 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 sentencias siguientes son equivalentes.
if A then B else . end
if A then B end
Se pueden agregar 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, el array y el objeto vacíos.
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. Esto es un filtro, no un operador.
42 | if (. < 33 or . > 66 | not) then "medium"
else "big or small"
end
El operador alternativo te permite especificar un valor «predeterminado» si una expresión es false o null.
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, escribirás un poco de código para ayudarte a prepararte para comprar un vehículo.
Tienes tres tareas: determinar si vas a necesitar una licencia; elegir entre dos vehículos; y estimar el precio aceptable de un vehículo usado.
Algunos tipos de vehículos requieren una licencia de conducir para poder conducirlos.
Asume que solo los tipos "car" y "truck" requieren una licencia; todo lo demás se puede conducir sin una.
Implementa la función needs_license que recibe el tipo de vehículo y devuelve un valor Boolean que indica si necesitas una licencia para ese tipo de vehículo.
"car" | needs_license
# => true
"bike" | needs_license
# => false
Has evaluado tus opciones de vehículos disponibles.
Lograste reducirlas a dos opciones, pero necesitas ayuda para tomar la decisión final.
Implementa la función choose_vehicle que recibe un array de dos vehículos como argumento y devuelve una decisión, que es la opción que aparece primero en el orden del diccionario.
["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 obtener un precio justo en la concesionaria. Como te interesa comprar un vehículo usado, el precio depende de la 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.
Recibe un objeto que contiene el precio original y la edad del vehículo, y devuelve el precio estimado en la concesionaria.
{"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.