Στην jq, οι αριθμοί μπορούν να συγκριθούν χρησιμοποιώντας τους παρακάτω τελεστές σύγκρισης και ισότητας.
| Σύγκριση | Τελεστής |
|---|---|
| Μεγαλύτερο από | a > b |
| Μεγαλύτερο ή ίσο με | a >= b |
| Μικρότερο από | a < b |
| Μικρότερο ή ίσο με | a <= b |
| Ίσο με | a == b |
| Διάφορο από | a != b |
Το αποτέλεσμα της σύγκρισης είναι πάντα μια τιμή boolean, δηλαδή είτε true είτε 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.
Οι παραπάνω τελεστές σύγκρισης μπορούν επίσης να χρησιμοποιηθούν για τη σύγκριση συμβολοσειρών. Σε αυτή την περίπτωση, εφαρμόζεται σειρά λεξικού (λεξικογραφική). Η σειρά είναι βάσει της τιμής του κωδικού σημείου Unicode.
"Apple" > "Pear", # => false
"a" < "above", # => true
"a" == "A" # => false
Πρέπει να είσαι προσεκτικός όταν συγκρίνεις δύο μεταβλητές που φαίνεται να περιέχουν αριθμητικές τιμές αλλά είναι τύπου συμβολοσειράς. Λόγω της σειράς λεξικού, το αποτέλεσμα δεν θα είναι το ίδιο με τη σύγκριση τιμών τύπου αριθμού.
10 < 2, # => false
"10" < "2" # => true (because "1" comes before "2")
Ο τελεστής == της jq είναι σαν το === της JavaScript, με την έννοια ότι πράγματα που "μοιάζουν" ίδια, αλλά είναι διαφορετικών τύπων, δεν είναι ίσα.
"3" == 3 # => false
# the value on the left has type string,
# the value on the right has type number.
Δύο πίνακες είναι ίσοι αν όλα τα αντίστοιχα στοιχεία είναι ίσα.
[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
Δύο αντικείμενα είναι ίσα αν έχουν τα ίδια ζεύγη κλειδιού-τιμής.
{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
Η έκφραση υπό συνθήκη της jq είναι if A then B else C end.
Το if-then-else είναι ένα φίλτρο όπως όλα τα ενσωματωμένα της jq: παίρνει μια είσοδο και παράγει μια έξοδο.
Αν η έκφραση A παράγει μια "αληθοφανή" τιμή, τότε το φίλτρο if αξιολογεί το B.
Διαφορετικά αξιολογεί το C.
Η είσοδος του φίλτρου if θα περαστεί στο B ή στο C.
42 | if . < 50 then "small" else "big" end # => "small"
5 | if . % 2 == 0 then . / 2 else . * 4 end # => 20
Η ρήτρα else είναι προαιρετική; οι παρακάτω δύο εντολές είναι ισοδύναμες.
if A then B else . end
if A then B end
Περαιτέρω συνθήκες μπορούν να προστεθούν με το elif.
42 | if . < 33 then "small"
elif . < 66 then "medium"
else "big"
end
# => "medium"
Χρησιμοποίησε όσες ρήτρες elif χρειάζεσαι.
Οι μόνες "ψευδείς" τιμές στην jq είναι: false και null.
Όλα τα άλλα είναι "αληθή", ακόμα και ο αριθμός μηδέν και η κενή συμβολοσειρά, ο κενός πίνακας και το κενό αντικείμενο.
Οι τελεστές boolean and και or μπορούν να χρησιμοποιηθούν για τη δημιουργία σύνθετων ερωτημάτων.
42 | if . < 33 or . > 66 then "big or small"
else "medium"
end
Για άρνηση, χρησιμοποίησε το not. Αυτό είναι ένα φίλτρο, όχι τελεστής.
42 | if (. < 33 or . > 66 | not) then "medium"
else "big or small"
end
Ο εναλλακτικός τελεστής σου επιτρέπει να ορίσεις μια "προεπιλεγμένη" τιμή αν μια έκφραση είναι ψευδής ή null.
A // B
# This is identical to
if A then A else B end
Για παράδειγμα
[3, 5, 18] | add / 2 # => 13
[] | add / 2 # => error: null (null) and number (2) cannot be divided
[] | add // 0 / 2 # => 0
Σε αυτή την άσκηση, θα γράψεις κώδικα που θα σε βοηθήσει να προετοιμαστείς για να αγοράσεις ένα όχημα.
Έχεις τρεις εργασίες: να καθορίσεις αν θα χρειαστεί να βγάλεις δίπλωμα οδήγησης, να διαλέξεις ανάμεσα σε δύο οχήματα και να υπολογίσεις την αποδεκτή τιμή για ένα μεταχειρισμένο όχημα.
Κάποια είδη οχημάτων απαιτούν δίπλωμα οδήγησης για να τα οδηγήσεις.
Θεώρησε ότι μόνο τα είδη "car" και "truck" απαιτούν δίπλωμα· όλα τα υπόλοιπα μπορούν να οδηγηθούν χωρίς δίπλωμα.
Υλοποίησε τη συνάρτηση needs_license, η οποία παίρνει το είδος του οχήματος και επιστρέφει Boolean (λογική τιμή) που δείχνει αν χρειάζεσαι δίπλωμα για αυτό το είδος οχήματος.
"car" | needs_license
# => true
"bike" | needs_license
# => false
Έχεις αξιολογήσει τις επιλογές σου από τα διαθέσιμα οχήματα.
Κατάφερες να τις περιορίσεις σε δύο επιλογές, αλλά χρειάζεσαι βοήθεια για να πάρεις την τελική απόφαση.
Υλοποίησε τη συνάρτηση choose_vehicle, η οποία παίρνει ως είσοδο έναν πίνακα με δύο οχήματα και επιστρέφει μια απόφαση: την επιλογή που έρχεται πρώτη σε λεξικογραφική σειρά.
["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."
Τώρα που πήρες την απόφασή σου, θέλεις να σιγουρευτείς ότι θα πάρεις μια δίκαιη τιμή στην αντιπροσωπεία. Εφόσον ενδιαφέρεσαι να αγοράσεις ένα μεταχειρισμένο όχημα, η τιμή εξαρτάται από το πόσο παλιό είναι το όχημα. Για μια χονδρική εκτίμηση, θεώρησε ότι αν το όχημα είναι λιγότερο από 3 ετών, κοστίζει το 80% της αρχικής τιμής που είχε όταν ήταν ολοκαίνουργιο. Αν είναι πάνω από 10 ετών, κοστίζει το 50%. Αν το όχημα είναι τουλάχιστον 3 ετών αλλά όχι μεγαλύτερο από 10 ετών, κοστίζει το 70% της αρχικής τιμής.
Υλοποίησε τη συνάρτηση resell_price, η οποία εφαρμόζει αυτή τη λογική χρησιμοποιώντας if, elif και else.
Παίρνει ένα αντικείμενο που περιέχει την αρχική τιμή και την ηλικία του οχήματος και επιστρέφει την εκτιμώμενη τιμή στην αντιπροσωπεία.
{"original_price": 1000, "age": 1} | resell_price
# => 800
{"original_price": 1000, "age": 5} | resell_price
# => 700
{"original_price": 1000, "age": 15} | resell_price
# => 500
Γράψου στο Exercism για να μάθεις και να κατακτήσεις jq με 12 έννοιες75 ασκήσεις και πραγματική καθοδήγηση από ανθρώπους, όλα δωρεάν.