In jq kannst du Zahlen mit den folgenden Vergleichs- und Gleichheitsoperatoren vergleichen.
| Vergleich | Operator |
|---|---|
| Größer als | a > b |
| Größer oder gleich | a >= b |
| Kleiner als | a < b |
| Kleiner oder gleich | a <= b |
| Gleich | a == b |
| Ungleich | a != b |
Das Ergebnis des Vergleichs ist immer ein boolescher Wert, also entweder true oder 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.
Die obigen Vergleichsoperatoren kannst du auch verwenden, um Strings zu vergleichen. In diesem Fall wird eine Wörterbuchreihenfolge (lexikografische Reihenfolge) angewendet. Die Reihenfolge richtet sich nach dem Unicode-Codepoint-Wert.
"Apple" > "Pear", # => false
"a" < "above", # => true
"a" == "A" # => false
Du musst vorsichtig sein, wenn du zwei Variablen vergleichst, die numerische Werte zu enthalten scheinen, aber vom Typ String sind. Wegen der Wörterbuchreihenfolge ist das Ergebnis nicht dasselbe wie beim Vergleich von Werten des Typs Zahl.
10 < 2, # => false
"10" < "2" # => true (because "1" comes before "2")
Der ==-Operator von jq ist wie JavaScripts === in dem Sinne, dass Dinge, die gleich „aussehen", aber von unterschiedlichem Typ sind, nicht gleich sind.
"3" == 3 # => false
# the value on the left has type string,
# the value on the right has type number.
Zwei Arrays sind gleich, wenn alle entsprechenden Elemente gleich sind.
[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
Zwei Objekte sind gleich, wenn sie dieselben Schlüssel-Wert-Paare haben.
{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
Der bedingte Ausdruck von jq lautet if A then B else C end.
if-then-else ist ein Filter wie alle eingebauten Funktionen von jq: Er nimmt eine Eingabe und erzeugt eine Ausgabe.
Wenn der Ausdruck A einen „truthy"-Wert erzeugt, wertet der if-Filter B aus.
Andernfalls wertet er C aus.
Die Eingabe des if-Filters wird an B oder C weitergegeben.
42 | if . < 50 then "small" else "big" end # => "small"
5 | if . % 2 == 0 then . / 2 else . * 4 end # => 20
Die else-Klausel ist optional; die folgenden beiden Anweisungen sind gleichwertig.
if A then B else . end
if A then B end
Weitere Bedingungen kannst du mit elif hinzufügen.
42 | if . < 33 then "small"
elif . < 66 then "medium"
else "big"
end
# => "medium"
Verwende so viele elif-Klauseln, wie du brauchst.
Die einzigen „falschen" Werte in jq sind false und null.
Alles andere ist „wahr", sogar die Zahl null und der leere String, das leere Array und das leere Objekt.
Mit den booleschen Operatoren and und or kannst du komplexe Abfragen aufbauen.
42 | if . < 33 or . > 66 then "big or small"
else "medium"
end
Zum Negieren verwendest du not. Das ist ein Filter, kein Operator.
42 | if (. < 33 or . > 66 | not) then "medium"
else "big or small"
end
Mit dem alternativen Operator kannst du einen „Standardwert" angeben, falls ein Ausdruck falsch oder null ist.
A // B
# This is identical to
if A then A else B end
Zur Veranschaulichung
[3, 5, 18] | add / 2 # => 13
[] | add / 2 # => error: null (null) and number (2) cannot be divided
[] | add // 0 / 2 # => 0
In dieser Übung schreibst du etwas Code, um dich auf den Kauf eines Fahrzeugs vorzubereiten.
Du hast drei Aufgaben: Finde heraus, ob du einen Führerschein brauchst; wähle zwischen zwei Fahrzeugen; und schätze den angemessenen Preis für ein gebrauchtes Fahrzeug.
Manche Fahrzeugarten erfordern einen Führerschein, um sie zu fahren.
Gehe davon aus, dass nur die Arten "car" und "truck" einen Führerschein erfordern; alles andere kann ohne Führerschein gefahren werden.
Implementiere die Funktion needs_license, die die Fahrzeugart entgegennimmt und einen booleschen Wert zurückgibt, der angibt, ob du für diese Fahrzeugart einen Führerschein brauchst.
"car" | needs_license
# => true
"bike" | needs_license
# => false
Du hast deine Optionen an verfügbaren Fahrzeugen geprüft.
Du hast sie auf zwei Optionen eingegrenzt, aber du brauchst Hilfe bei der endgültigen Entscheidung.
Implementiere die Funktion choose_vehicle, die ein Array mit zwei Fahrzeugen als Eingabe entgegennimmt und eine Entscheidung zurückgibt: die Option, die in lexikografischer Reihenfolge zuerst kommt.
["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."
Jetzt, wo du deine Entscheidung getroffen hast, willst du sichergehen, dass du beim Händler einen fairen Preis bekommst. Da du ein gebrauchtes Fahrzeug kaufen möchtest, hängt der Preis davon ab, wie alt das Fahrzeug ist. Für eine grobe Schätzung gehst du davon aus, dass ein Fahrzeug, das weniger als 3 Jahre alt ist, 80 % des ursprünglichen Preises kostet, den es neu hatte. Ist es älter als 10 Jahre, kostet es 50 %. Ist das Fahrzeug mindestens 3 Jahre alt, aber nicht älter als 10 Jahre, kostet es 70 % des ursprünglichen Preises.
Implementiere die Funktion resell_price, die diese Logik mit if, elif und else anwendet.
Sie nimmt ein Objekt entgegen, das den ursprünglichen Preis und das Alter des Fahrzeugs enthält, und gibt den geschätzten Preis beim Händler zurück.
{"original_price": 1000, "age": 1} | resell_price
# => 800
{"original_price": 1000, "age": 5} | resell_price
# => 700
{"original_price": 1000, "age": 15} | resell_price
# => 500
Melde dich bei Exercism an, um jq mit 12 Konzepte75 Übungen und echtem menschlichen Mentoring zu lernen und zu meistern, alles kostenlos.