En jq, les nombres peuvent être comparés à l'aide des opérateurs relationnels et d'égalité suivants.
| Comparaison | Opérateur |
|---|---|
| Supérieur à | a > b |
| Supérieur ou égal à | a >= b |
| Inférieur à | a < b |
| Inférieur ou égal à | a <= b |
| Égal à | a == b |
| Différent de | a != b |
Le résultat de la comparaison est toujours une valeur booléenne, donc soit true, soit 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.
Les opérateurs de comparaison ci-dessus peuvent aussi servir à comparer des strings. Dans ce cas, c'est un ordre lexicographique (de dictionnaire) qui s'applique. Le classement se fait par valeur de point de code Unicode.
"Apple" > "Pear", # => false
"a" < "above", # => true
"a" == "A" # => false
Il faut faire attention quand on compare deux variables qui semblent contenir des valeurs numériques mais qui sont de type string. À cause de l'ordre lexicographique, le résultat ne sera pas le même que si l'on comparait des valeurs de type nombre.
10 < 2, # => false
"10" < "2" # => true (because "1" comes before "2")
L'opérateur == de jq est comme le === de JavaScript en ce sens que des choses qui « se ressemblent » mais qui sont de types différents ne sont pas égales.
"3" == 3 # => false
# the value on the left has type string,
# the value on the right has type number.
Deux tableaux sont égaux si tous les éléments correspondants sont égaux.
[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
Deux objets sont égaux s'ils ont les mêmes paires clé-valeur.
{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
if
L'expression conditionnelle de jq s'écrit if A then B else C end.
if-then-else est un filtre, comme toutes les fonctions natives de jq : il prend une entrée et produit une sortie.
Si l'expression A produit une valeur considérée comme vraie, le filtre if évalue B.
Sinon, il évalue C.
L'entrée du filtre if est transmise à B ou à C.
42 | if . < 50 then "small" else "big" end # => "small"
5 | if . % 2 == 0 then . / 2 else . * 4 end # => 20
La clause else est facultative ; les deux instructions suivantes sont équivalentes.
if A then B else . end
if A then B end
if imbriquéesOn peut ajouter d'autres conditions avec elif.
42 | if . < 33 then "small"
elif . < 66 then "medium"
else "big"
end
# => "medium"
Utilise autant de clauses elif que nécessaire.
Les seules valeurs « fausses » en jq sont : false et null.
Tout le reste est « vrai », même le nombre zéro, la chaîne vide, le tableau vide et l'objet vide.
Les opérateurs booléens and et or permettent de construire des requêtes complexes.
42 | if . < 33 or . > 66 then "big or small"
else "medium"
end
Pour nier, utilise not. C'est un filtre, pas un opérateur.
42 | if (. < 33 or . > 66 | not) then "medium"
else "big or small"
end
L'opérateur alternatif permet de spécifier une valeur « par défaut » quand une expression est fausse ou nulle.
A // B
# This is identical to
if A then A else B end
Pour illustrer
[3, 5, 18] | add / 2 # => 13
[] | add / 2 # => error: null (null) and number (2) cannot be divided
[] | add // 0 / 2 # => 0
Dans cet exercice, tu vas écrire du code pour t'aider à te préparer à acheter un véhicule.
Tu as trois tâches : déterminer si tu auras besoin d'un permis de conduire ; choisir entre deux véhicules ; et estimer le prix acceptable pour un véhicule d'occasion.
Certains types de véhicules exigent un permis de conduire pour être conduits.
Suppose que seuls les types "car" et "truck" exigent un permis ; tout le reste peut être conduit sans permis.
Implémente la fonction needs_license, qui prend le type de véhicule et renvoie un booléen indiquant si tu as besoin d'un permis pour ce type de véhicule.
"car" | needs_license
# => true
"bike" | needs_license
# => false
Tu as évalué les véhicules disponibles.
Tu as réussi à réduire ton choix à deux options, mais tu as besoin d'aide pour prendre la décision finale.
Implémente la fonction choose_vehicle qui prend un tableau de deux véhicules en entrée et renvoie une décision, à savoir l'option qui vient en premier dans l'ordre du dictionnaire.
["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."
Maintenant que tu as pris ta décision, tu veux t'assurer de payer un prix équitable chez le concessionnaire. Comme tu cherches à acheter un véhicule d'occasion, le prix dépend de l'âge du véhicule. Pour une estimation approximative, suppose que si le véhicule a moins de 3 ans, il coûte 80 % de son prix d'origine lorsqu'il était neuf. S'il a plus de 10 ans, il coûte 50 %. Si le véhicule a au moins 3 ans mais pas plus de 10 ans, il coûte 70 % de son prix d'origine.
Implémente la fonction resell_price qui applique cette logique à l'aide de if, elif et else.
Elle prend un objet contenant le prix d'origine et l'âge du véhicule et renvoie le prix estimé chez le concessionnaire.
{"original_price": 1000, "age": 1} | resell_price
# => 800
{"original_price": 1000, "age": 5} | resell_price
# => 700
{"original_price": 1000, "age": 15} | resell_price
# => 500
Inscris-toi sur Exercism pour apprendre et maîtriser jq avec 12 concepts75 exercices, et un vrai mentorat humain, le tout gratuitement.