A jq-ban a számokat a következő relációs és egyenlőségoperátorokkal hasonlíthatod össze.
| Összehasonlítás | Operátor |
|---|---|
| Nagyobb mint | a > b |
| Nagyobb vagy egyenlő | a >= b |
| Kisebb mint | a < b |
| Kisebb vagy egyenlő | a <= b |
| Egyenlő | a == b |
| Nem egyenlő | a != b |
Az összehasonlítás eredménye mindig logikai érték, azaz vagy true, vagy 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.
A fenti összehasonlító operátorokkal stringeket is össze lehet hasonlítani. Ilyenkor a szótári (lexikográfiai) sorrend érvényesül. A sorrendet a Unicode-kódpont értéke határozza meg.
"Apple" > "Pear", # => false
"a" < "above", # => true
"a" == "A" # => false
Óvatosnak kell lenned, amikor két olyan változót hasonlítasz össze, amelyek számértéket látszanak tartalmazni, de string típusúak. A szótári sorrend miatt az eredmény nem lesz ugyanaz, mint amikor number típusú értékeket hasonlítasz össze.
10 < 2, # => false
"10" < "2" # => true (because "1" comes before "2")
A jq == operátora abban az értelemben hasonlít a Javascript === operátorához, hogy azok a dolgok, amelyek ugyanúgy „kinéznek”, de különböző típusúak, nem egyenlők.
"3" == 3 # => false
# the value on the left has type string,
# the value on the right has type number.
Két tömb akkor egyenlő, ha az összes megfelelő elemük egyenlő.
[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
Két objektum akkor egyenlő, ha ugyanazok a kulcs-érték párok vannak bennük.
{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 kifejezésA jq feltételes kifejezése az if A then B else C end.
Az if-then-else szűrő, akárcsak a jq összes beépített eleme: bemenetet kap, és kimenetet állít elő.
Ha az A kifejezés „truthy” értéket állít elő, akkor az if szűrő a B-t értékeli ki.
Ellenkező esetben a C-t értékeli ki.
Az if szűrő bemenete a B-hez vagy a C-hez kerül továbbításra.
42 | if . < 50 then "small" else "big" end # => "small"
5 | if . % 2 == 0 then . / 2 else . * 4 end # => 20
Az else ág elhagyható; a következő két utasítás egyenértékű.
if A then B else . end
if A then B end
if utasításokTovábbi feltételeket az elif kulcsszóval adhatsz hozzá.
42 | if . < 33 then "small"
elif . < 66 then "medium"
else "big"
end
# => "medium"
Annyi elif ágat használhatsz, amennyire szükséged van.
Az egyetlen „hamis” érték a jq-ban a false és a null.
Minden más „igaz”, még a nulla szám, valamint az üres string, tömb és objektum is.
A logikai operátorok (and és or) összetett lekérdezések felépítésére használhatók.
42 | if . < 33 or . > 66 then "big or small"
else "medium"
end
Tagadáshoz a not-ot használd. Ez egy szűrő, nem operátor.
42 | if (. < 33 or . > 66 | not) then "medium"
else "big or small"
end
Az alternatív operátor segítségével „alapértelmezett” értéket adhatsz meg arra az esetre, ha egy kifejezés hamis vagy null.
A // B
# This is identical to
if A then A else B end
Íme egy példa:
[3, 5, 18] | add / 2 # => 13
[] | add / 2 # => error: null (null) and number (2) cannot be divided
[] | add // 0 / 2 # => 0
Ebben a feladatban olyan kódot írsz, amely segít felkészülni egy jármű megvásárlására.
Három részfeladatod van: állapítsd meg, hogy szükséged lesz-e jogosítványra; válassz két jármű közül; és becsüld meg egy használt jármű elfogadható árát.
Egyes járműtípusok vezetéséhez jogosítvány kell.
Tegyük fel, hogy csak a "car" és a "truck" típushoz kell jogosítvány; minden más vezethető jogosítvány nélkül.
Valósítsd meg a needs_license függvényt, amely a jármű típusát kapja, és egy Boolean értéket ad vissza arról, hogy kell-e jogosítvány az adott típusú járműhöz.
"car" | needs_license
# => true
"bike" | needs_license
# => false
Mérlegelted az elérhető járműveket.
Sikerült kettőre szűkítened a kört, de segítségre van szükséged a végső döntéshez.
Valósítsd meg a choose_vehicle függvényt, amely két járműből álló tömböt kap bemenetként, és visszaad egy döntést: azt a lehetőséget, amelyik előrébb van szótári sorrendben.
["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."
Most, hogy meghoztad a döntést, szeretnéd biztosítani, hogy tisztességes árat kapj a kereskedésben. Mivel használt járművet szeretnél venni, az ár attól függ, milyen idős a jármű. Durva becslésként tegyük fel, hogy ha a jármű kevesebb mint 3 éves, az eredeti, vadonatúj kori árának 80%-át éri. Ha több mint 10 éves, az 50%. Ha a jármű legalább 3 éves, de legfeljebb 10 éves, az eredeti ár 70%-át éri.
Valósítsd meg a resell_price függvényt, amely ezt a logikát alkalmazza if, elif és else használatával.
Egy objektumot kap, amely az eredeti árat és a jármű korát tartalmazza, és visszaadja a kereskedésben becsült árat.
{"original_price": 1000, "age": 1} | resell_price
# => 800
{"original_price": 1000, "age": 5} | resell_price
# => 700
{"original_price": 1000, "age": 15} | resell_price
# => 500
Iratkozz fel az Exercism-re, hogy megtanuld és elsajátítsd a(z) jq nyelvet 12 fogalom75 feladat segítségével, valódi emberi mentorálással, mindez ingyen.